我正在使用此函数将byte []转换为位图:
public static Bitmap ArrayToBitmap(
byte[] bytes, int width, int height, PixelFormat pixelFormat)
{
var image = new Bitmap(width, height, pixelFormat);
var imageData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
ImageLockMode.ReadWrite, pixelFormat);
try
{
Marshal.Copy(bytes, 0, imageData.Scan0, bytes.Length);
}
finally
{
image.UnlockBits(imageData);
}
return image;
}
这很有效。如果我将结果转换回byte []并将其输出为ByteArrayContent,我会在浏览器中看到生成的图像。我的源文件是PNG,对于pixelFormat参数,我可以使用Format16bppArgb1555或Format32bppArgb,如果我从位图转换回byte [],则两者都有效。
但是,当我尝试将转换后的位图输入:
时using (var g = Graphics.FromImage(bitmap))
{
// add custom text to image
}
对于Format16bppArgb1555我尝试使用.FromImage()创建Graphics对象时,在“using”行上出现“内存不足”异常。例外情况如下:
Message = "Out of memory."
Source = "System.Drawing"
并且对于Format32bppArgb,结果是一个损坏的图像,其上面有我的自定义文本。
是否有可能让其中一个工作?或者,是否有一种快速的方法将byte []转换为图像,添加文本并将结果再次转换回byte []?
我尝试使用Magick.NET(Q8-x64),这使我能够完成上述所有操作,但速度非常慢。比常规方法慢:
编辑2: 值得一提的是,原始的PNG图像来自HTML5 Canvas。ToDataUrl()方法。