c - 从 C 中的位图中读取 BGR 颜色

标签 c bitmap pixel bgr

我试图从 24 位 BMP 文件中获取 RGB 值。我使用的图像是一个很小的图像,全是红色,所以所有像素 BGR 配置应该是 B:0 G:0 R:255。我这样做:

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 个像素发生一次变化。

最佳答案

BMP file format , 每行像素数据都可以被填充以四舍五入到 4 字节的倍数。

如果您有 10 个 24 位像素,那就是 30 个字节,然后是 2 个字节的填充。您的代码不会跳过填充。

关于c - 从 C 中的位图中读取 BGR 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359047/

相关文章:

java - 在java中绘制像素

c++ - 在 Python 或 C++ 中获取像素颜色的最快方法?

c - (*b)[0] 与 *b[0] - 数组和指针

c - 在 C 中的 return 语句中使用 -> 运算符

具有 10 个标记的 Android 基本 API v2 MapActivity outOfMemory

c - 在 C 中打印位图

c++ - C中实现的平均直流估计器的解释

c - 无法将标准输出置于宽字符模式

c# - 我能否以编程方式捕获 Silverlight 用户控件的快照?

c++ - 在光线追踪器中实现软阴影