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
}
posted @ 2018-04-16 14:36  schips  阅读(284)  评论(0)    收藏  举报