我试图从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