用C或C++读入一张图片,用c语言基本函数操作,对文件结构进行分析读入一幅图片像素数据并显示。
时间: 2024-02-12 14:07:36 浏览: 83
C语言实现一个图片的读出和写入
首先,我们需要了解图片文件的结构。常见的图片文件格式有BMP、JPEG、PNG等,这里以BMP格式为例进行说明。
BMP图片文件由文件头、位图信息头、调色板和位图数据四部分组成。其中,文件头和位图信息头是固定的,调色板和位图数据则根据图片的位深度和颜色数目而不同。
接下来,我们将以C语言为例,介绍如何读入一张BMP图片,并显示出来。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(2) // 结构体按2字节对齐
// BMP文件头结构体
typedef struct BMPFileHeader {
char bfType[2]; // 文件类型,必须为"BM"
unsigned int bfSize; // 文件大小,单位为字节
unsigned short bfReserved1; // 保留,必须为0
unsigned short bfReserved2; // 保留,必须为0
unsigned int bfOffBits; // 位图数据的起始位置,单位为字节
} BMPFileHeader;
// BMP位图信息头结构体
typedef struct BMPInfoHeader {
unsigned int biSize; // 信息头的大小,单位为字节
int biWidth; // 图像的宽度,单位为像素
int biHeight; // 图像的高度,单位为像素
unsigned short biPlanes; // 必须为1
unsigned short biBitCount; // 每个像素所占位数
unsigned int biCompression; // 压缩方式,0表示不压缩
unsigned int biSizeImage; // 图像数据的大小,单位为字节
int biXPelsPerMeter; // 水平分辨率,单位为像素/m
int biYPelsPerMeter; // 垂直分辨率,单位为像素/m
unsigned int biClrUsed; // 使用的颜色数目,0表示使用所有颜色
unsigned int biClrImportant; // 重要的颜色数目,0表示所有颜色都重要
} BMPInfoHeader;
// 读取BMP图片
unsigned char* readBMP(char* filename, int* width, int* height, int* channels) {
FILE* fp = fopen(filename, "rb");
if (!fp) {
printf("Failed to open file: %s\n", filename);
return NULL;
}
BMPFileHeader fileHeader;
BMPInfoHeader infoHeader;
fread(&fileHeader, sizeof(BMPFileHeader), 1, fp);
fread(&infoHeader, sizeof(BMPInfoHeader), 1, fp);
if (strcmp(fileHeader.bfType, "BM") != 0) {
printf("Not a BMP file: %s\n", filename);
fclose(fp);
return NULL;
}
if (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 32) {
printf("Only support 24-bit or 32-bit BMP file: %s\n", filename);
fclose(fp);
return NULL;
}
*width = infoHeader.biWidth;
*height = abs(infoHeader.biHeight);
*channels = infoHeader.biBitCount / 8;
int dataSize = *width * *height * *channels;
unsigned char* data = (unsigned char*)malloc(dataSize);
fseek(fp, fileHeader.bfOffBits, SEEK_SET);
fread(data, dataSize, 1, fp);
fclose(fp);
return data;
}
// 显示图片
void showImage(unsigned char* data, int width, int height, int channels) {
// TODO: 实现显示图片的代码
}
int main() {
int width, height, channels;
unsigned char* data = readBMP("test.bmp", &width, &height, &channels);
if (!data) {
return 1;
}
showImage(data, width, height, channels);
free(data);
return 0;
}
```
在上面的代码中,我们定义了两个结构体`BMPFileHeader`和`BMPInfoHeader`,分别对应BMP文件头和位图信息头。在`readBMP`函数中,我们首先打开指定的BMP文件,然后依次读取文件头和位图信息头。接着,我们判断文件类型是否为BMP格式,以及位深度是否为24位或32位。最后,我们根据图片的宽、高、通道数计算出位图数据的大小,读取位图数据并返回。
在`showImage`函数中,我们需要根据读取到的图片数据进行显示,这里就不再展开讲解。
阅读全文