几周以来,我一直在努力用 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);
}
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
调用的返回值!