Проблема заключается в том, что для растрового изображения, имеющего 30 000 пикселей, требуется 3 * 30 000 байтов для представления в 24-битном цвете.Каждый пиксель представлен тремя байтами.Ваш цикл копирует байты в целые числа.А поскольку ваш целочисленный массив имеет длину всего 30 000 целых чисел, он потерпит неудачу.
Это если вы написали:
var fileBufferArray = new int[30000];
for (int i = 0; i < 90000; ++i)
{
fileBufferArray[i] = bitmapData[i];
}
Очевидно, что это не удастся.
Вам нужно объединить каждые три байта в одно 24-битное значение.Один из способов сделать это - изменить присваивание во внутреннем цикле следующим образом:
int r = i * 3;
int pixelvalue = row[r];
pixelValue = (pixelValue << 8) | row[r+1];
pixelValue = (pixelValue << 8) | row[r+2];
fileBufferArray[j * columns + i] = pixelValue;
Это не самый краткий и не самый эффективный способ сделать это, но он иллюстрирует концепцию.Я также не мог бы иметь порядок значений правильно.Они могут быть сохранены с младшим байтом, а не старшим байтом.Несмотря на это, концепция одна и та же.