我有一个格式为{Indexed8}的2208 x 3000 TransformedBitmap对象,我正在对它执行.CopyPixels()。我正在使用
(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7) / 8)(假设'formattedBitmap‘是我试图从其复制像素的图像的名称),用于我的方法调用中的'stride’值和一个长度为2208的字节数组。我在代码中的其他地方(其中图像的格式是{Gray8} )中也有类似的东西。但是,当我尝试对上述图像执行相同的操作时,我不断收到“参数超出范围”异常,指出“参数值不能小于‘6624000’。\r\n参数名称:buffer。”
我的问题是:为什么世界上完全相同的代码似乎在一个地方工作,而在另一个地方却不能工作?用外行的话来说,世界上什么是真正的“大步”?如何才能在不出现此错误的情况下获得所需的效果(复制比特)?我做错了什么?
任何对此的帮助都将不胜感激。非常感谢!
发布于 2010-09-15 03:16:48
我已经弄明白了(wow...kinda不敢相信我花了将近一个小时的时间来搞这个!)。问题是字节数组的大小必须是
sourceImage.PixelHeight * stride哪里
int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7) / 8);在我的代码中,它在其他位置工作的原因是因为我没有复制整个图像的像素(就像我试图在我遇到问题的地方做的那样),我只复制了单个row...that的像素,基本上是2008x1的区域,所以目标字节数组的大小可以正好是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);干杯!
https://stackoverflow.com/questions/3711947
复制相似问题