【问题标题】:How to assign one IntPtr to other IntPtr如何将一个 IntPtr 分配给另一个 IntPtr
【发布时间】:2012-08-21 18:46:57
【问题描述】:

我正在尝试使用 BitmapData 类?并且在将 IntPtr 值分配给 BitmapData.Scan0 属性时遇到一些问题。这是我的代码:

var data = bmp.LockBits(new rectangle(Point.Empty, bmp.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
data.Scan0 = rh.data.Scan0HGlobal;
bmp.UnlockBits(data);

但是,解锁图像后,它并没有改变。为什么?在调试模式下,我看到 data.Scan0 更改为 rh.data.Scan0HGlobal 值。在 rh.data.Scan0HGlobal 我有指向包含像素原始数据的内存的指针。

【问题讨论】:

  • 那么,谢谢大家?但我自己解决了我的问题。我只是使用 ntdll 中的 memcpy 函数
  • 如果您的问题已经解决,您应该将其中一个答案(对您最有帮助)标记为您的问题的解决方案。如果没有一个答案是有帮助的,那么请写下你自己的答案并接受它。否则,有人可能会找到您的问题并与之相关,但无法找到解决方案。请记住,这是问答网站,所以没有 A 的 Q 真的没有任何意义。

标签: .net bitmapdata intptr


【解决方案1】:

好吧,Scan0 属性设置器不是私有的,这有点令人遗憾。但是,是的,这没有任何作用。您需要自己复制字节以更改图像。使用 Marshal.Copy() 通过 pinvoke memcpy() 的 byte[] 辅助数组进行复制。

【讨论】:

  • +1 同意,我刚才也在考虑这个问题。在不更新许多其他属性(即宽度、高度、步幅等)的情况下更新 Scan0 是没有意义的。设置器无法仅知道第一行的地址来执行此操作。我想知道他们为什么不把它设为只读?
  • 但是,我的内存块标识为 Scan0 的大小
【解决方案2】:

你应该这样做:

// Lock image bits.
// Also note that you probably should be using bmp.PixelFormat instead of
// PixelFormat.Format32bppArgb (if you are not sure what the image pixel
// format is).
var bmpData = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size),
    ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

// This is total number of bytes in bmp.
int byteCount = bmpData.Stride * bmp.Height;
// And this is where image data will be stored.
byte[] rgbData = new byte[byteCount];

// Copy bytes from image to temporary byte array rgbData.
System.Runtime.InteropServices.Marshal.Copy(
    bmpData.Scan0, rgbData, 0, byteCount);    

// TODO: Work with image data (now in rgbData), perform calculations,
// set bytes, etc.
// If this operation is time consuming, perhaps you should unlock bits
// before doing it.
// Do remember that you have to lock them again before copying data
// back to the image.

// Copy bytes from rgbData back to the image.
System.Runtime.InteropServices.Marshal.Copy(
   rgbData, 0, bmpData.Scan0, byteCount);
// Unlock image bits.
image.UnlockBits(bmpData);

// Save modified image, or do whatever you want with it.

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多