问题描述
当位图转换为字节数组,然后转换为内存流并保存时,
图像颜色开始反转。这段代码是我网站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。
如果需要透明度,则必须使用支持透明度的图像格式。您可能还需要先清除整个矩形,具体取决于格式。