我在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
我很清楚这不起作用,它只是我基本上想要实现的一个例子。
答案 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。