【问题标题】:C# Getting the pixel data efficiently from System.Drawing.BitmapC# 从 System.Drawing.Bitmap 有效获取像素数据
【发布时间】: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);返回原始; // 字节[]

标签: c# bitmap resize pixel


【解决方案1】:

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

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 对象,因为它实现了 IDisposable。

【讨论】:

  • 不完全是我希望的答案,但使用 Marshal.Copy 使它看起来比复制每个整数的整数要好得多。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 2013-11-06
  • 2016-06-10
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多