首页 > 解决方案 > 使用 imageformat.memorybmp 时保持透明度

问题描述

我正在组合 2 个图像,第一个图像将是画布,第二个图像将是叠加层。这两个图像都没有实际文件,而是生成并存储在内存流中。

帆布

 MemoryStream canvasStream = new MemoryStream();
 var canvas =  new Bitmap(canvasWidth, canvasHeight, PixelFormat.Format32bppArgb);
 canvas.Save(canvasStream, ImageFormat.Png);

覆盖

这是一个比画布小,它将被放置在画布的中间。它看起来像一个相框,或者只是一个带有 20 像素填充的图像。

 MemoryStream overlayStream = new MemoryStream();
 var canvas =  new Bitmap(overlayWidth, overlayHeight, PixelFormat.Format32bppArgb);
 canvas.Save(overlayStream, ImageFormat.Png);

保存到内存流后,这两个图像 Imageformat 默认为Imageformat.MemoryBmp而不是Imageformat.PNG。因此,失去了透明度。

结合画布和叠加

        Bitmap combinedImage = new Bitmap(canvas.Width, canvas.Height, PixelFormat.Format24bppRgb);

        using (Graphics graphic = Graphics.FromImage(combinedImage))
        {
            graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphic.Clear(Color.White);

            int BGCanvasXCenter = 0;
            Rectangle rectDest = new Rectangle(0, 0, canvas.Width, canvas.Height);

            if (fixSize)
            {
                // center image
                BGCanvasXCenter = (canvas.Width / 2) - (overlay.Width / 2);
                rectDest = new Rectangle(BGCanvasXCenter, 0, overlay.Width, overlay.Height);
            }

            var imageAttributes = new ImageAttributes();
            imageAttributes.SetWrapMode(WrapMode.TileFlipXY);

            graphic.DrawImage(
                overlay,
                rectDest,
                0, 0, overlay.Width, overlay.Height,
                GraphicsUnit.Pixel,
                imageAttributes
            );
        }

使用内存流时有没有办法保持透明度?如何将图像格式设置为 PNG?

请注意,要求不是在此过程中保存实际文件,这就是我求助于 memorystream 的原因。

提前致谢!

标签: c#bitmapsystem.drawing

解决方案


推荐阅读