2015-07-07 1 views
0

Мне нужно поместить 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: Первая строка пикселя в порядке. Но левая сторона - это своего рода копия правой стороны с гораздо более синей и очень маленькой зеленой.

Может ли кто-нибудь помочь мне решить эту проблему?

ответ

0

У вас есть ваши x и y, обменянные, когда вы оцениваете значения в вашем массиве. Я думаю. Это не похоже на то, что я проверил это или что-то еще. ПУТЬ слишком ленив для этого.

for (i=Y-1; i>=0; i--) { 
    for (p=0; p<X; p++) { 
     n=fread(&img1[i][p].blue 

i прогулки по Y и p прогулки по X.

Когда вы таНос его, вы установите его для IMG [х] [у]

theArray=(pixel**) malloc(X*sizeof(pixel*)); 
for (int i=0; i<X; i++) { 
    theArray[i]=(pixel*) malloc(Y*sizeof(pixel)); 

Общие рекомендации: Держитесь подальше от глобал, для этого я бы передать переменные, как вы закомментированы. Назовите свои переменные лучше, чем t и e. Каковы ваши значения возврата 29,30,31? Попробуйте enum или #defines с именами. (и вы просто игнорируете возвращаемое значение после этого)

Самая большая причина, по которой эта ошибка не была очевидна, вероятно, является схемой именования. i и p? Давай, переходим в sizeX и sizeY, а x и y - ваши рабочие переменные. Если контекст не был bitmapin(), переменные должны быть даже bitmapSizeX. Именование очень важно.

+0

Большое спасибо! Вы решили мою проблему! Вы правы, я должен был лучше назвать переменные. – Pol

 Смежные вопросы

  • Нет связанных вопросов^_^