数组边界外的位图

时间:2016-03-09 23:16:26

标签: c# .net wpf bitmap

我有以下代码:

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;当索引传递像素[]数组计数时,有没有人知道如何有效地解决这个问题而不会超大数组呢?

我希望随着时间的推移显示进度,因此需要精确的数组:)

提前致谢。

2 个答案:

答案 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返回的值。