C# 索引超出了位图数组的边界
我有把字节数组转换成位图的代码。。(在我的项目中,我不能使用MemoryStream或其他位图转换器。) 这是我的密码C# 索引超出了位图数组的边界,c#,arrays,bitmap,indexing,C#,Arrays,Bitmap,Indexing,我有把字节数组转换成位图的代码。。(在我的项目中,我不能使用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;
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;
}
...
...
..
..
}
你能帮我解决这个问题吗?我如何处理这个越界问题 我不确定为什么会发生这种情况,但问题是imageData大小不等于
width*height
这段代码应该可以修复它(尽管它可能不是您希望它做的事情)
公共静态位图转换位图(整数宽度、整数高度、字节[]图像数据)
{
var data=新字节[imageData.Length*4];
INTO=0;
对于(var i=0;i
这里的问题是imageData
的长度小于height*width
。因此,您最终会在此行中得到一个异常,因为i
大于imageData.Length
var value = imageData[i];
考虑一下你在问题中发布的尺寸
- 数据:614400
- 图像数据:105212
数据的大小
被计算为高度*宽度*4
,因此我们可以通过除以4
来计算高度*宽度
,结果是高度*宽度==153600
。这显然大于105212
,因此每次执行o++时,都会访问数组边界之外的对象。您将超出数据范围。您正试图访问数据[o^4]@AMR,但imageData比data?大6倍。。那么我该如何解决这个问题呢?我应该删除o++?在每次o++之后,写出o的值,看看它最终爆炸时的大小。我认为这与数据是6x imageData,而不是您设置的4x有关。我认为图像数据不等于宽度*高度。。。我认为当访问imageData[I]而不是data[o++]时会发生异常。我认为imageData在105.212,但我的值会增加到153.600。。。。我想这就是问题所在。。
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;
}
...
...
..
..
}
var value = imageData[i];