来自TransformedBitmap对象的"跨越"困境

JTo*_*and 7 c# wpf byte image-processing pixels

我有一个2208 x 3000 TransformedBitmap对象,格式为{Indexed8},我正在做.CopyPixels().我正在使用

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7) / 8)
Run Code Online (Sandbox Code Playgroud)

(假设'formattedBitmap'是我正在尝试复制像素的图像的名称),用于我的方法调用中的'stride'值和长度为2208的字节数组.我在代码中的其他地方有一些工作(图像的格式是{Gray8}.但是,在我想要在上述图像上做同样的事情的地方,我不断得到一个"超出范围的参数"异常说"参数值不能小于'6624000'.\ r \n参数名称:缓冲区."

我对此的疑问是:为什么世界上完全相同的代码似乎在一个地方而不是另一个地方?用外行人的话来说,世界上究竟是什么呢?如何在不出现此错误的情况下获得所需的影响(复制位)?我究竟做错了什么?

对此的任何帮助将非常感谢.非常感谢!

JTo*_*and 9

我已经想到了这个(哇......有点不敢相信我花了一个小时的时间搞乱这个!).问题是字节数​​组必须大小

sourceImage.PixelHeight * stride
Run Code Online (Sandbox Code Playgroud)

哪里

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7) / 8);
Run Code Online (Sandbox Code Playgroud)

它在我的代码中的其他位置工作的原因是因为而不是复制整个图像的像素(因为我正在尝试做我遇到问题的地方),我只是复制单行的像素. ..也就是说,基本上是一个2008 x 1区域,因此目标字节数组的大小可能正好是2208,它可以正常工作.为了将来参考,可能总是或多或少地使用这样的东西:

int width = source.PixelWidth;
int height = source.PixelHeight;
int stride = width * ((source.Format.BitsPerPixel + 7) / 8);

byte[] bits = new byte[height * stride];

source.CopyPixels(bits, stride, 0);
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 哦,MSDN有一篇关于'stride'是什么的相当不错的文章.它当然不是"外行人"的术语,我实际上发现它有点卷入,但它是一个很好的参考(不过你可能需要多次阅读以真正理解你是否对C#中的图像处理不熟悉) (就像我一样!))链接:http://msdn.microsoft.com/en-us/library/aa473780(VS.85).aspx (4认同)