读取BMP文件并旋转它

问题描述 投票:0回答:1

几周以来,我一直在努力用 C 语言创建一个可以将 BMP 文件顺时针或逆时针旋转 90 度的函数。无论我做什么或如何读取/更改标题似乎都不起作用,我什至尝试让人工智能生成代码,但可惜似乎没有任何作用,我不知道我做错了什么或如果我的配置有问题或者什么。如果我遗漏了什么,或者有更简单的方法,请告诉我

谢谢你。

编辑:在这里删除了第二个问题,稍后会问,抱歉

(抱歉,是西班牙语)

typedef struct
{
    unsigned short  bm;       //tipo de fichero "BM"
    unsigned int    tam;      //tamanyo
    unsigned short  res1;     //reservado
    unsigned short  res2;     //reservado
    unsigned int    inicio;   //inicio datos de imagen
    unsigned int    head;     //tamanyo de la cabecera del bitmap
    unsigned int    x;        //ancho en pixeles
    unsigned int    y;        //alto en pixeles
    unsigned short  planes;   //numero de planos
    unsigned short  tam_pun;  //tamanyo de cada punto
    unsigned int    comp;     //compresion
    unsigned int    img;      //tamanyo imagen
    unsigned int    r_hor;    //resolucion horizontal
    unsigned int    r_ver;    //resolucion vertical
    unsigned int    t_color;  //tamanyo tabla de color
    unsigned int    impor;    //contador de colores importantes
}bmpHeader;

void rotar(FILE *f, int rotar) {
    bmpHeader header;
    unsigned char *data;
    unsigned char *data_rot;
    int i, j, k;

    // Leer la cabecera del BMP
    fread(&header, sizeof(bmpHeader), 1, f);

    // Asignar memoria para los datos de la imagen
    data = (unsigned char *)malloc(header.img);
    data_rot = (unsigned char *)malloc(header.img);

    // Leer los datos de la imagen
    fread(data, header.img, 1, f);

    // Rotar la imagen
    if (rotar == 0) {
        // Rotar 90 grados a la derecha
        for (i = 0; i < header.x; i++) {
            for (j = 0; j < header.y; j++) {
                k = (header.x - i - 1) * header.y + j;
                data_rot[k] = data[i * header.y + j];
            }
        }
    } else {
        // Rotar 90 grados a la izquierda
        for (i = 0; i < header.x; i++) {
            for (j = 0; j < header.y; j++) {
                k = i * header.y + (header.y - j - 1);
                data_rot[k] = data[i * header.y + j];
            }
        }
    }

    // Escribir la cabecera del BMP
    fwrite(&header, sizeof(bmpHeader), 1, f);

    // Escribir los datos de la imagen
    fwrite(data_rot, header.img, 1, f);

    // Liberar la memoria
    free(data);
    free(data_rot);
}
c
1个回答
0
投票
BMP 文件的一个问题是,由于文件开头的两个字节“BM”魔术,标头中的所有 4 字节值都未对齐。因此,通常最好将其从“bmpHeader”结构中删除并单独读取。

bmpHeader header; char magic[2]; if (fread(magic, 1, sizeof(magic), f) != sizeof(magic) || magic[0] != 'B' || magic[1] != 'M' || fread(&header, 1, sizeof(header), f) != sizeof(header)) { fprintf(stderr, "error reading bmp header"); exit(1); }
这样您就无需担心标题中的对齐或填充。

您还应该始终检查

fread

 调用的返回值!

© www.soinside.com 2019 - 2024. All rights reserved.