我有一个2208 x 3000 TransformedBitmap对象,格式为{Indexed8},我正在做.CopyPixels()。我正在使用
(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7) / 8)
(假设'formattedBitmap'是我正在尝试复制像素的图像的名称),用于我的方法调用中的'stride'值以及长度为2208的字节数组。我在代码中的其他地方有一些工作(图像的格式是{Gray8}。但是,在我想要在上述图像上做同样的事情的地方,我不断得到一个“超出范围的参数”异常说“参数值不能小于'6624000'。\ r \ n参数名称:缓冲区。”
我对此的疑问是:为什么世界上完全相同的代码似乎在一个地方而不是另一个地方?用外行人的话来说,世界上究竟是什么呢?如何在不出现此错误的情况下获得所需的影响(复制位)?我做错了什么?
非常感谢任何帮助。非常感谢!
答案 0 :(得分: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);
干杯!