当位图转换为字节数组然后转换为内存流并保存时,图像颜色开始反转

问题描述

当位图转换为字节数组,然后转换为内存流并保存时,

图像颜色开始反转。这段代码是我网站ommrudraksha.com

上动态图像创建的一部分
 using (var bmp = new System.Drawing.Bitmap(width + 10,height + 10))
            {
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.Flush();
                    bmp.Save("ss.jpg");
                 }
            }

上面的代码可以正确保存图像。

但是当bmp转换为memorystream并保存时,背景变为黑色。 下面的代码生成黑色图像。

            var memStream = new MemoryStream();
            bmp.Save(memStream,ImageFormat.Jpeg);
            var bytes = memStream.ToArray();
            var ms2 = new MemoryStream(bytes);
            Bitmap.FromStream(ms).Save("ss1.jpg");

解决方法

让我们先检查一下您的绘图代码:

bmp.Save("ss.jpg");

对于您而言,此操作实际上是另存为“ PNG”文件格式,而不管文件名如何。我发现使用十六进制编辑器。 Windows非常聪明,可以检查文件头,因此即使扩展名错误,您也很有可能仍可以预览或以其他方式打开它。您还可以使用第二个参数明确指定输出格式。

默认情况下,新的PNG也是透明的。即使某些图片格式支持Alpha通道(例如BMP和GIF),也可能默认设置为黑色。这意味着,如果您真的要另存为BMP,则必须进行一些其他处理。


这使我明白了为什么您的输出图像是黑色的。 Jpeg根本不支持透明性,因此在转换透明PNG时,Jpeg默认为黑色。参见this post

如果需要透明度,则必须使用支持透明度的图像格式。您可能还需要先清除整个矩形,具体取决于格式。