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

Aro*_*okh 12 c# resize pixel bitmap

我在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 
Run Code Online (Sandbox Code Playgroud)

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

The*_*ing 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);
Run Code Online (Sandbox Code Playgroud)

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

您不必删除已分配的字节,只需在完成ID Disposposable时完成原始Bitmap对象的Dispose.