WINDOWS Bitmap单色图

win下单色bitmap图是由 头+信息+数据组成 其中 头占14个字节 信息占40个字节 数据在62个偏移后

这是c语言版定义的结构

typedef struct {
    unsigned short   signature;      // 文件类型,必须为"BM"
    unsigned int    filesize;          // 文件大小,整个文件的大小
    unsigned short  reserved1;         // 保留字段1,一般为0
    unsigned short  reserved2;         // 保留字段2,一般为0
    unsigned int    dataoffset;        // 数据偏移量,即图像数据相对于文件起始处的偏移
} BMPFileHeader;

typedef struct {
    unsigned int    headersize;        // 头信息长度,对于Windows位图,一般为40
    signed int      width;             // 图像宽度,单位为像素
    signed int      height;            // 图像高度,单位为像素
    unsigned short  planes;            // 图像平面数,一般为1
    unsigned short  bitdepth;          // 每个像素所使用的位数,一般为24
    unsigned int    compression;       // 图像数据的压缩方式,一般为0(表示不压缩)
    unsigned int    imagesize;         // 图像数据的实际大小,以字节为单位
    signed int      horizontalres;     // 水平分辨率,单位为像素每米
    signed int      verticalres;       // 垂直分辨率,单位为像素每米
    unsigned int    numcolors;         // 所有颜色的数量,0表示使用默认取值
    unsigned int    importantcolors;   // 重要颜色的数量,0表示所有颜色都重要
} BMPInfoHeader;
 

c语言版本读取位图数据

//读取bmp函数 注意!!!bmp图片大小不宜超过1M(如超过1M图片,请重新改写打印指令内存)
void bmpToByteArray(const char* filename)
{
    //构建bmp文件结构体和信息结构体
    BMPFileHeader BMPFileHeader;
    BMPInfoHeader BMPInfoHeader;

    //打开文件
    FILE* file = fopen(filename, "rb");  // 以二进制只读模式打开文件
    if (!file)
    {

        printf("无法打开文件:%s\n", filename);
        return NULL;
    }
    //读头文件结构体数据
    fread(&BMPFileHeader, 1,sizeof(BMPFileHeader), file);  // 读取BMP文件头

    // 移动文件指针到信息结构体
    fseek(file, sizeof(BMPFileHeader), SEEK_SET);
    fread(&BMPInfoHeader, 1,sizeof(BMPInfoHeader), file);

    if (BMPFileHeader.signature != 0x4D42 || BMPInfoHeader.planes != 1)
    {
        printf("不是单色BMP图片\n");
        fclose(file);
        return NULL;
    }
    // 移动文件指针到像素数据的位置
    fseek(file, BMPFileHeader.dataoffset, SEEK_SET);

    // 计算像素数据所占字节数(win位图宽不足4个字节补齐4个字节)
    //如果是用bitmap指令打印 如果宽度像素不是32的倍速 自动补齐部分会是一条黑线
    rowSize = ((BMPInfoHeader.width + 31) / 32) * 4;
    colheigth=BMPInfoHeader.height;

    //数据的总字节数
    dataSize = rowSize * BMPInfoHeader.height;


    // 动态分配内存来存储像素数据
    Bitmapdata=(char*)malloc(dataSize);


    // 读取像素数据
    readsize=fread(Bitmapdata,1,dataSize,file);

    //关闭文件
    fclose(file);


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值