当位图转换为字节数组然后转换为内存流并保存时,图像颜色会反转
image color is becoming inverted when bitmap is converted to byte array and then to memory stream and saved
当位图转换为字节数组然后到内存流并保存时,图像颜色会发生反转。此代码是我网站上动态图像创建的一部分 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。
如果您需要透明度,则必须使用支持它的图像格式。您可能还必须先清除整个矩形,具体取决于格式。
当位图转换为字节数组然后到内存流并保存时,图像颜色会发生反转。此代码是我网站上动态图像创建的一部分 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。
如果您需要透明度,则必须使用支持它的图像格式。您可能还必须先清除整个矩形,具体取决于格式。