C#从System.Drawing.Bitmap有效获取像素数据

时间:2011-09-10 18:21:02

标签: c# bitmap resize pixel

我在HDD上有几个(~2GB)原始24bpp RGB文件。 现在我想要检索它的一部分并将其缩放到所需的大小 (唯一允许的比例是1,1 / 2,1 / 4,1 / 8,......,1/256)

所以我现在正在读取感兴趣的矩形中的每一行到一个数组中,这使得我得到一个高度正确但宽度错误的位图。

下一步我将从新创建的数组中创建一个Bitmap 这是通过使用指针完成的,因此不会复制所涉及的数据 接下来我在Bitmap上调用GetThumbnailImage,它会创建一个具有正确尺寸的新位图。

现在我想返回新创建的位图的原始像素数据(作为字节数组)。 但要实现这一点,我目前正在使用LockBits将数据复制到一个新数组中。

所以我的问题是:有没有办法将像素数据从Bitmap转换为字节数组而不复制它?

类似的东西:

var bitmapData = scaledBitmap.LockBits(...)
byte[] rawBitmapData = (byte[])bitmapData.Scan0.ToPointer()
scaledBitmap.UnlockBits(bitmapData)
return rawBitmapData 

我很清楚这不起作用,它只是我基本上想要实现的一个例子。

1 个答案:

答案 0 :(得分:18)

我认为这是你最好的选择。

var bitmapData = scaledBitmap.LockBits(...);
var length = bitmapData.Stride * bitmapData.Height;

byte[] bytes = new byte[length];

// Copy bitmap to byte[]
Marshal.Copy(bitmapData.Scan0, bytes, 0, length);
scaledBitmap.UnlockBits(bitmapData);

如果你想要一个字节[]的传递,你必须复制它。

您不必删除已分配的字节,只需完成原始Bitmap对象的Dispose,因为它实现了IDisposable。