我有以下代码:
if (source != null)
{
int count = 0;
int stride = (source.PixelWidth * source.Format.BitsPerPixel + 7) / 8;
byte[] pixels = new byte[source.PixelHeight * stride];
source.CopyPixels(pixels, stride, 0);
for (int y = 0; y < source.PixelHeight; y = y + 2)
{
for (int x = 0; x < source.PixelWidth; x = x + 2)
{
int index = y * stride + 4 * x;
count = index;
byte red = pixels[index];
byte green = pixels[index + 1];
byte blue = pixels[index + 2];
byte alpha = pixels[index + 3];
}
}
MessageBox.Show("Array Length, pixels: " + pixels.Count() + "," + count);
}
然而,我遇到一个问题,某些位图图像,当逐步抛出异常
&#34; System.IndexOutOfRangeException&#34;当索引传递像素[]数组计数时,有没有人知道如何有效地解决这个问题而不会超大数组呢?
我希望随着时间的推移显示进度,因此需要精确的数组:)
提前致谢。
答案 0 :(得分:0)
您应该能够逐步执行代码并确定index
何时大于pixels
缓冲区大小。
为您的代码添加一些调试输出并逐步完成。类似的东西:
if (source != null)
{
int count = 0;
int stride = (source.PixelWidth * source.Format.BitsPerPixel + 7) / 8;
byte[] pixels = new byte[source.PixelHeight * stride];
source.CopyPixels(pixels, stride, 0);
for (int y = 0; y < source.PixelHeight; y = y + 2)
{
for (int x = 0; x < source.PixelWidth; x = x + 2)
{
int index = y * stride + 4 * x;
count = index;
int bufsize = source.PixelHeight * stride;
System.Diagnostics.Debug.WriteLine($"bufsize={bufsize}, index={index}, x={x}, y={y}");
System.Diagnostics.Debug.Assert((index+3) <= bufsize);
byte red = pixels[index];
byte green = pixels[index + 1];
byte blue = pixels[index + 2];
byte alpha = pixels[index + 3];
}
}
MessageBox.Show("Array Length, pixels: " + pixels.Count() + "," + count);
}
编写代码的一个重要部分是学习如何调试,使用调试器,以及验证算法的正确性。祝你的项目好运。
答案 1 :(得分:0)
此代码会在Format.BitsPerPixel
小于32的任何图片上崩溃,例如没有alpha的24位RGB。您也不应该假设步幅是您认为的,您应该使用从LockBits返回的值。