7

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

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7) / 8)

(假设'formattedBitmap'是我试图从中复制像素的图像的名称)我的方法调用中的'stride'值和一个长度为2208的字节数组。我在代码的其他地方也有类似的东西(图像的格式是{Gray8}。但是,我试图在上述图像上做同样的事情,我不断得到一个“参数超出范围”异常提示“参数值不能小于 '6624000'。\r\n参数名称:缓冲区。”

我对此的问题是:为什么完全相同的代码似乎在一个地方工作而不是另一个地方工作?用外行的话来说,世界上真正的“大步”是什么?以及如何在不出现此错误的情况下获得所需的效果(复制位)?我究竟做错了什么?

对此的任何帮助将不胜感激。非常感谢!

4

1 回答 1

9

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

sourceImage.PixelHeight * stride

在哪里

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7) / 8);

它在我的代码中的其他位置工作的原因是因为我没有复制整个图像的像素(正如我试图在遇到问题的地方做的那样),我只复制了单行的像素。 ..也就是说,基本上是一个 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);

干杯!

于 2010-09-14T19:16:48.070 回答