Пока вы всегда получаете доступ к своим данным через трехмерный массив, не имеет значения, как структура массива располагается в памяти.В вашем примере вы определяете первый индекс (i) как индекс столбца, индекс (j) как индекс строки и индекс (k) как индекс компонента пикселя.
Я подозреваю, что ваш файл изображения имеетДанные организованы стандартным способом, который представляет собой массив строк, где каждая строка представляет собой массив пикселей, где каждый пиксель представляет собой массив компонентов цвета.Если это так, то вы можете изменить свой код для работы с этой структурой:
ifile.open(argv[2], ios::in|ios::binary);
for(int i=0; i<1278; i++){
for(int j=0; j<968; j++){
for(int k=0; k<3; k++){
Imagedata1[j][i][k]=ifile.get();
}
}
}
Обратите внимание, что я только что поменял местами индексы i и j в теле самого внутреннего цикла for, остальныекод идентичен вашему.
Если вам также необходимо получить доступ к данным изображения в виде плоского буфера, то вам следует реорганизовать массивы так, чтобы данные в памяти имитировали макет из файла.Для этого вы хотите, чтобы первым измерением были строки, затем столбцы, а затем компоненты цвета.В конечном итоге это будет выглядеть так:
unsigned char Imagedata1[968][1278][3];
ifile.open(argv[2], ios::in|ios::binary);
for(int i=0; i<968; i++){
for(int j=0; j<1278; j++){
for(int k=0; k<3; k++){
Imagedata1[i][j][k]=ifile.get();
}
}
}
Обновление: после быстрого обсуждения в комментариях, кажется, вы действительно хотите прочитать это более эффективно.Если вы хотите загрузить это изображение в стек (вероятно, не очень хорошая идея), вы бы объявили буфер изображения следующим образом:
unsigned char Imagedata1[968][1278][3];
Я бы вместо этого поместил его в кучу, например:
unsigned char* Imagedata1 = new unsigned char[968*1278*3];
Затем вы можете прочитать данные из файла с помощью:
if (fread(Imagedata1, 1278*3, 968, fd) != 968) {
// handle error here
}
Обратите внимание, что числа, которые вы указываете как число и размер в вызове fread, не так важны, если эти дваумноженные числа равны ширине * высоте * компонентов.
Если вам необходимо получить доступ к этому изображению в виде трехмерного массива, я рекомендую вам создать вспомогательную функцию, что-то вроде этого:
unsigned char* getPixel(int col, int row)
{
return Imagedata1 + row * 1278 * 3 + col * 3;
}
Возвращаемое значение этой функции может быть использовано в качестве одномерного массива из трех элементов: красного, зеленого и синего пикселей.
В качестве окончательного предложения, я рекомендую вам обернуть ваше изображениев классе, и добавьте переменные-члены, которые определяют ширину и высоту (и, возможно, количество цветовых плоскостей).Вы не хотите жестко кодировать 1278 и 968 повсюду в вашем коде!
Надеюсь, это поможет.