c 获取BMP文件信息
#include <stdio.h> #include <string.h> typedef struct BITMAPFILEHEADER { // BMP文件头 u_int16_t bfType; //2Bytes,必须为"BM",即0x424D 才是Windows位图文件 u_int32_t bfSize; //4Bytes,整个BMP文件的大小 u_int16_t bfReserved1; //2Bytes,保留,为0 u_int16_t bfReserved2; //2Bytes,保留,为0 u_int32_t bfOffBits; //4Bytes,文件起始位置到图像像素数据的字节偏移量 }__attribute__ ((packed)) BITMAPFILEHEADER; typedef struct BITMAPINFOHEADER { // BMP信息头 u_int32_t biSize; //4Bytes,INFOHEADER结构体大小,存在其他版本I NFOHEADER,用作区分 u_int32_t biWidth; //4Bytes,图像宽度(以像素为单位) u_int32_t biHeight; //4Bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2Bottom u_int16_t biPlanes; //2Bytes,图像数据平面,BMP存储RGB数据,因此总为1 u_int16_t biBitCount; //2Bytes,图像像素位数 u_int32_t biCompression; //4Bytes,0:不压缩,1:RLE8,2:RLE4 u_int32_t biSizeImage; //4Bytes,4字节对齐的图像数据大小 u_int32_t biXPelsPerMeter; //4 Bytes,用象素/米表示的水平分辨率 u_int32_t biYPelsPerMeter; //4 Bytes,用象素/米表示的垂直分辨率 u_int32_t biClrUsed; //4 Bytes,实际使用的调色板索引数,0:使用所有的调色板索引 u_int32_t biClrImportant; //4 Bytes,重要的调色板索引数,0:所有的调色板索引都重要 }__attribute__ ((packed)) BITMAPINFODEADER; typedef struct _tagRGBQUAD { //BMP调色板 char rgbBlue; //指定蓝色强度 char rgbGreen; //指定绿色强度 char rgbRed; //指定红色强度 char rgbReserved; //保留,设置为0 }__attribute__ ((packed)) RGBQUAD; // 如果文件是BMP,则取它的信息 int getBMPinfo(const char* pathname) { // 处理文件 BITMAPFILEHEADER head; BITMAPINFODEADER info; char output_pathname[512] = {0}; FILE *fp; char headbuf[54]; fp = fopen(pathname,"rb"); fread(headbuf,1,54,fp); fseek(fp,0,SEEK_SET); fread(&head, 1, sizeof(BITMAPFILEHEADER), fp); // BMP文件头 fread(&info, 1, sizeof(BITMAPINFODEADER), fp); // BMP信息头 if(strncmp(headbuf,"BM",2)==0) { // 是BMP文件 printf("是BMP文件\n"); printf("宽度: %d\n",abs(info.biWidth)); printf("高度: %d\n",abs(info.biHeight)); return 0; } fclose(fp); return -1;// DEBUG }
如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/