Мне нужно поместить BMP (RGB 24 бит) изображение в 2D-массив, используя язык C. Я написал несколько функций, но эти функции работают только с квадратными изображениями. Я создал эту структуру для хранения пикселей:bmp image to matrix (2d array) in c
typedef struct{
int red;
int green;
int blue;
}pixel;
Я также создал два Int EXTERN значения Y и X, чтобы сохранить высоту и ширину изображения. Это код (я опустил setWidthHeight и CreateNewImage функции, потому что я уверен, что они работают)
int X, Y;
int bitmapin(FILE* fp,/* int height, int width, */ pixel** img1){
long n;
int t;
fseek(fp, 10, SEEK_SET);
fread(&t, 1, 4, fp); //reads the offset and puts it in t
fseek(fp, t, SEEK_SET);
int i, p, e;
e=4-((X*3)%4);
if (e==4) {
e=0;
}
for (i=Y-1; i>=0; i--) {
for (p=0; p<X; p++) {
n=fread(&img1[i][p].blue, 1, 1, fp);
if (n!=1) {
return 29;
}
n=fread(&img1[i][p].green, 1, 1, fp);
if (n!=1) {
return 30;
}
n=fread(&img1[i][p].red, 1, 1, fp);
if (n!=1) {
return 31;
}
}
fseek(fp, e, SEEK_CUR);
}
return 0;
}
pixel** make2Dpixelarray(/*int y, int x*/){
pixel** theArray;
theArray=(pixel**) malloc(X*sizeof(pixel*));
for (int i=0; i<X; i++) {
theArray[i]=(pixel*) malloc(Y*sizeof(pixel));
}
return theArray;
}
int main(int argc, const char * argv[]) {
FILE* fp;
fp=fopen("/Users/admin/desktop/Immagine5.bmp", "r");
if (fp==NULL) {
return 20;
}
setWidthHeight(fp); //Puts X=width and Y=height, it works
pixel** img1=make2Dpixelarray(); //Creates 2D pixel array and get the memory for it
bitmapin(fp, img1); //this function should put the values of RGB pixel into the matrix
CreateNewImage(fp, img1); //This function creates a new image.
return 0;
}
Когда изображение квадрата нет никаких проблем, но когда:
- Высота> Ширина: Я получаю ошибку «BAD_ACCESS ...», когда я пытаюсь прочитать первый пиксель в bitmapin()
- width> height: Первая строка пикселя в порядке. Но левая сторона - это своего рода копия правой стороны с гораздо более синей и очень маленькой зеленой.
Может ли кто-нибудь помочь мне решить эту проблему?
Большое спасибо! Вы решили мою проблему! Вы правы, я должен был лучше назвать переменные. – Pol