2013-11-02 1 views
1

У меня заголовок заголовка и информации. первый пиксель читает в порядке со следующим кодом.C чтение пикселов bmp в массив 2d

// The BMPHEADER structure. 
typedef struct { 
byte  sigB; 
byte  sigM; 
int32_t  fileSize; 
int16_t  resv1; 
int16_t  resv2; 
int32_t  pixelOffset; 
} tBmpHeader; 

// The BMPINFOHEADER structure. 
typedef struct { 
int32_t  size; 
int32_t  width; 
int32_t  height; 
int16_t  colorPlanes; 
int16_t  bitsPerPixel; 
byte  zeros[24]; 
} tBmpInfoHeader; 

typedef uint8_t byte; 

typedef struct { 
byte blue; 
byte green; 
byte red; 
} tPixel; 

// A BMP image consists of the BMPHEADER and BMPINFOHEADER structures, and the 2D pixel array. 
typedef struct { 
tBmpHeader  header; 
tBmpInfoHeader infoHeader; 
tPixel   **pixel; 
} tBmp; 

tPixel **BmpPixelAlloc(int pWidth, int pHeight) 
{ 
    tPixel **pixels = (tPixel **)malloc (pHeight * sizeof(tPixel *)); 
    for (int row = 0; row < pHeight; ++row) 
    { 
     pixels[row] = (tPixel *)malloc(pWidth * sizeof(tPixel)); 
    } 

    return pixels; 
} 

tError BmpRead(char *pFilename, tBmp *pBmp) 
{ 
pBmp->pixel = BmpPixelAlloc(pBmp->infoHeader.width, pBmp->infoHeader.height); 

if(FileRead(file, &pBmp->pixel, sizeof(tPixel), 1)!=0) 
{ 
    errorCode = ErrorFileRead; 
} 
} 

репетитор я разговаривал с сказал, что я должен сделать следующий

, но это дает мне ошибку сегментации. если я поставил печать в цикле, она печатает несколько тысяч раз, прежде чем говорить о неисправности сегментации. Я пробовал использовать двойной цикл, но это даже не компилировалось. Я потратил несколько часов на google, но не могу понять это.

+0

Зачем беспокоиться? Для этого уже есть простая в использовании и удобная для понимания [библиотека] (http://easybmp.sourceforge.net/). –

+0

домашнее задание assignmnet – Covertpyro

+0

Ну, и так, попробуйте пройти код в этой библиотеке. Вы можете узнать кое-что. –

ответ

0

Не думаю, что я понял это.

for(int i = 0; i < pBmp->infoHeader.height; ++i) 
{ 
    for(int j = 0; j < pBmp->infoHeader.width; ++j) 
    { 
     if(FileRead(file, &pBmp->pixel[i][j], sizeof(tPixel), 1)!=0) 
     { 
      errorCode = ErrorFileRead; 
     } 
    } 
}