【发布时间】:2011-11-14 11:31:33
【问题描述】:
我在 HDD 上有几个 (~2GB) 原始 24bpp RGB 文件。
现在我想检索其中的一部分并将其缩放到所需的大小。
(唯一允许的比例是 1、1/2、1/4、1/8、...、1/256)
所以我目前正在将感兴趣的矩形中的每一行读入一个数组,这给我留下了一个高度正确但宽度错误的位图。
下一步,我将从新创建的数组创建位图。
这是通过使用指针完成的,因此不涉及数据复制。
接下来我在 Bitmap 上调用 GetThumbnailImage,它会创建一个具有正确尺寸的新位图。
现在我想返回新创建的位图的原始像素数据(作为字节数组)。 但为了实现这一点,我目前正在使用 LockBits 将数据复制到一个新数组中。
所以我的问题是:有没有办法将像素数据从位图获取到字节数组而不复制它?
类似:
var bitmapData = scaledBitmap.LockBits(...)
byte[] rawBitmapData = (byte[])bitmapData.Scan0.ToPointer()
scaledBitmap.UnlockBits(bitmapData)
return rawBitmapData
我很清楚这行不通,这只是我基本上想要实现的一个例子。
【问题讨论】:
-
工作,而不是 unsafe{} void* to byte[] ,尝试 IntPtr ptr = bitmapData.Scan0; int bytes = Math.Abs(bitmapData.Stride) * bitmapData.Height;原始=新字节[字节]; Marshal.Copy(ptr, raw, 0, bytes);返回原始; // 字节[]