我試圖從24位BMP文件中獲取RGB值。我使用的圖像是一個很小的圖像,全部是紅色的,所以所有的像素BGR配置應該是B:0 G:0 R:255
。我這樣做:從位圖中讀取BGR顏色C
int main(int argc, char **argv)
{
principal();
return 0;
}
typedef struct {
unsigned char blue;
unsigned char green;
unsigned char red;
} rgb;
typedef struct {
int ancho, alto;
rgb *pixeles[MAX_COORD][MAX_COORD];
} tBitmapData;
void principal()
{
FILE *fichero;
tBitmapData *bmpdata = (tBitmapData *) malloc(sizeof(tBitmapData));
rgb *pixel;
int i, j, num_bytes;
unsigned char *buffer_imag;
char nombre[] = "imagen.bmp";
fichero = fopen(nombre, "r");
if (fichero == NULL)
puts("No encontrado\n");
else {
fseek(fichero, 18, SEEK_SET);
fread(&(bmpdata->ancho), sizeof((bmpdata->ancho)), 4, fichero);
printf("Ancho: %d\n", bmpdata->ancho);
fseek(fichero, 22, SEEK_SET);
fread(&(bmpdata->alto), sizeof((bmpdata->alto)), 4, fichero);
printf("Alto: %d\n", bmpdata->alto);
}
num_bytes = (bmpdata->alto * bmpdata->ancho * 3);
fseek(fichero, 54, SEEK_SET);
for (j = 0; j < bmpdata->alto; j++) {
printf("R G B Fila %d\n", j + 1);
for (i = 0; i < bmpdata->ancho; i++) {
pixel =
(rgb *) malloc(sizeof(rgb) * bmpdata->alto *
bmpdata->ancho * 3);
fread(pixel, 1, sizeof(rgb), fichero);
printf("Pixel %d: B: %3d G: %d R: %d \n", i + 1,
pixel->blue, pixel->green, pixel->red);
}
}
fclose(fichero);
}
的問題是,當我打印出來,第一個像素都很好,B:0 G:0 R:255
,但隨後他們開始改變B:0 G:255 R:0
,然後B:255 G:0 R:0
。如果寬度是10像素,則每10個像素髮生一次更改。
這可能不是你的問題的原因,但你意識到你分配*三次*必要的內存來保存*整個圖像*,*每像素*,並泄漏所有它?如果你要單獨爲每個像素「fread」,你可以使用在堆棧上分配的'rgb'結構。 – zwol 2011-03-19 00:36:44
此外,如果您可以上傳顯示問題的圖像文件,我們可以在其中找到某個位置,這將會很有幫助。 – zwol 2011-03-19 00:37:37
簡單的解釋是位圖的像素格式是32bpp。你不檢查它,這是一個錯誤。你也忽略了跨步,對24bpp格式致命。不要自己編寫這些代碼,知道如何以任意格式讀取圖像文件的庫很多。 – 2011-03-19 01:01:48