gpt4 book ai didi

C#,带有 IntPtr 的新位图,ArgumentException

转载 作者:行者123 更新时间:2023-12-04 00:30:18 25 4
gpt4 key购买 nike

我有一个非常奇怪的问题。

这是我的一个简化代码来解释:

class Bitmap1
{
public Bitmap nImage;
public IntPtr data;


public Bitmap1()
{
int w = 2450;
int h = 2450;

this.data = Marshal.AllocHGlobal(w*h);

nImage = new Bitmap(w, h, w, PixelFormat.Format8bppIndexed, data);

}
}

wh 等于 2448 时,如果我调用构造函数,一切都会正常工作。

但是当 h 和 w 等于 2450 时,我有一个 ArgumentException ,它似乎是由“new Bitmap(...);”启动的

我无法理解,文档也没有说 Marshal.AllocHGlobal 的大小有限制。

怎么了?还有其他方法可以实现我想要的功能吗?

非常感谢。

最佳答案

stride Type: System.Int32 Integer that specifies the byte offset between the beginning of one scan line and the next. This is usually (but not necessarily) the number of bytes in the pixel format (for example, 2 for 16 bits per pixel) multiplied by the width of the bitmap. The value passed to this parameter must be a multiple of four..

http://msdn.microsoft.com/en-us/library/zy1a2d14.aspx

所以你需要类似下面的东西:

int w = 2450;
int h = 2450;
int s = 2452;//Next multiple of 4 after w

this.data = Marshal.AllocHGlobal(s*h);

nImage = new Bitmap(w, h, s, PixelFormat.Format8bppIndexed, data);

这意味着每行之间有 2 个字节,它们只是填充,而不是位图本身的一部分。在进行指针算术时,您显然需要执行 s*y+x 而不是 w*y+x 来考虑填充。

关于C#,带有 IntPtr 的新位图,ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6135388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com