C# - 使用Graphics添加文本的快速字节数组到位图转换

时间:2016-06-26 17:56:10

标签: c# image-processing bitmap bytearray marshalling

我正在使用此函数将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),这使我能够完成上述所有操作,但速度非常慢。比常规方法慢:

  1. 将byte []转换为MemoryStream
  2. 从Image.FromStream()获取位图
  3. 添加文字
  4. bitmap.Save()到MemoryStream
  5. memoryStream.ToArray()
  6. 编辑2: 值得一提的是,原始的PNG图像来自HTML5 Canvas。ToDataUrl()方法。

0 个答案:

没有答案