0

我是编程这类东西的新手,搜索并没有帮助我。我在网上找到了以下代码,需要对其进行修改,因为这给了我 toint32() 上的溢出异常。

任何帮助表示赞赏!谢谢

// lock bitmap data
BitmapData  bmData = img.LockBits(
new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);

// copy image data

int srcStride = bmData.Stride;
int dstStride = bmData.Stride;


      int dst = bmData.Scan0.ToInt32() + dstStride * (height - 1);
      int src = pBuffer.ToInt32();

                for (int y = 0; y < height; y++)
                {
                    Win32.memcpy(dst, src, srcStride);
                    dst -= dstStride;
                    src += srcStride;
                }

// unlock bitmap data
img.UnlockBits(bmData);
4

1 回答 1

2

Scan0 是一个指针,如果在 64 位模式下运行,使用 ToInt32() 会溢出。您必须使用 ToInt64() 并转换回 IntPtr。您的 memcpy() 声明也是错误的。一些方便的声明:

private static IntPtr AddToPointer(IntPtr ptr, int offset) {
    return new IntPtr(ptr.ToInt64() + offset);
}

[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int memcpy(IntPtr dst, IntPtr src, int bytes);
于 2012-11-23T09:39:54.527 回答