【问题标题】:Index was outside the bounds of the array about bitmap索引超出了关于位图的数组范围
【发布时间】:2025-11-28 20:20:15
【问题描述】:

我有将字节数组转换为位图的代码。(在我的项目中,我不能使用 MemoryStream 或其他位图转换器。)

这是我的代码。

public static Bitmap ConvertBitMap(int width, int height, byte[] imageData)
        {
            var data = new byte[width * height * 4];
            int o = 0;

            for (var i = 0; i < width * height ; i++)
            {
                var value = imageData[i];


                data[o++] = value;
                data[o++] = value;
                data[o++] = value;
                data[o++] = 0;
            }
           ...
           ...
           ..
           ..
}

当我运行应用程序时,我说 “System.IndexOutOfRangeException:索引超出了数组的范围。”

这里是arrayData信息:

data   ------>     {byte[614400]}

imageData --->     {byte[105212]}

能否请任何人帮助我解决此问题?我该如何处理这个外部边界问题?

【问题讨论】:

  • 每次你做 o++ 它都会增加。您将超出数据范围。您正在尝试访问数据[o^4]
  • @AMR 但 imageData 比 data 大 6 倍? ..那么我该如何解决它应该删除o++?
  • 每次 o++ 后写出 o 的值,看看最后爆炸的时候是什么大小。
  • 我认为这与 data 是 6x imageData 的事实有关,而不是您设置的 4x。我认为 imageData 不等于 width*height ...我认为访问 imageData[i] 而不是 data[o++] 时发生异常
  • 它认为我的 ImageData 超过 105.212 但我正在递增到 153.600 .... 所以这是我猜的问题..

标签: c# arrays bitmap indexing


【解决方案1】:

这里的问题是imageData的长度小于height * width。因此你最终会在这条线上得到一个例外,因为i 大于imageData.Length

var value = imageData[i];

考虑您在问题中发布的尺寸

  • 数据:614400
  • 图像数据:105212

data 的大小计算为height * width * 4,因此我们可以通过除以4 来计算height * width,我们最终得到height * width == 153600。这显然比105212 大,因此您最终会访问数组边界之外

【讨论】:

    【解决方案2】:

    我不确定为什么会这样,但问题是 imageData 大小不等于 width*height

    这段代码应该可以修复它(尽管它可能不是您想要做的)

    public static Bitmap ConvertBitMap(int width, int height, byte[] imageData)
            {
                var data = new byte[imageData.Length * 4];
                int o = 0;
    
                for (var i = 0; i < imageData.Length ; i++)
                {
                    var value = imageData[i];
    
    
                    data[o++] = value;
                    data[o++] = value;
                    data[o++] = value;
                    data[o++] = 0;
                }
               ...
               ...
               ..
               ..
    }
    

    【讨论】: