BMP自定义头文件

     BMP 图片的结构包括:文件信息、位图信息,调色板信息,位图数据。前面三个就是我们需自定义的头文件,如果不需要自定义头文件则只需包含windows.h文件即可。

     需要注意的是,BMP文件头部信息的每一部分都是固定大小的,用sizeof计算windows.h自带BMP头文件结构体大小,可以得到它们的大小和都为54。

    而vs默认进行4字节对齐,如果不取消4字节对齐,结构体的大小就会产生变化,导致bmp读图失败,所以在处理文件头部信息时需要按 1 字节对齐的方式访问,使用#pragma pack (1)取消字节对齐。

一、自定义头文件(header.h)

#pragma once
typedef unsigned short WORD;
typedef unsigned char  BYTE;
#pragma pack (1)                               //按1字节进行对齐 即:不进行4字节对齐
struct BITMAPFILEHEADER                        //定义文件信息头,总大小14字节,如果4字节对齐了就是16字节,数据读取会出错
{
        WORD   bfType;                         //2字节,文件类型为BM
        int    bfSize;                         //4字节,位图文件大小
        int    bfReserved;                     //4字节保留字节
        int    bfOffbits;                      //4字节,字节偏移量
};
struct BITMAPINFOHEADER                        //定义位图信息段
{
        int    biSize;                         //4字节 此结构体长度为40
        int    biWidth;                        //4字节 位图宽
        int    biHeight;                       //4字节 位图高
        WORD   biPlanes;                       //2字节 平面数,为1
        WORD   biBitCount;                     //2字节 bmp颜色位数
        int    biCompression;                  //4字节 压缩方式,bmp图不压缩,为0
        int    biSizeImage;                    //4字节 实际位图数据占用的字节数无压缩,为0
        int    biXPelsPerMeter;                //4字节 水平分辨率 bit/m
        int    biYPelsPerMeter;                //4字节 垂直分辨率 bit/m
        int    biClrUsed;                      //4字节 使用的颜色数,bmp位数小于16才会用到
        int    biClrImportant;                 //4字节 重要颜色数,如果为0则所有颜色都重要
};
struct RGBQUAD                                 //定义调色板
{
        BYTE rgbRed;
        BYTE rgbGreen;
        BYTE rgbBlue;
        BYTE rgbReserved;                       //保留位,为0
};

二、定义bmp结构体接口文件

1.使用了ifdef预处理器区分window.h自带的接口文件和自己定义的文件

#define HEADER
#ifdef HEADER
   #include "header.h" //自定义接口文件
#else
   #include<windows.h>
#endif

2.BMP结构体

struct BMP
{        
  BITMAPFILEHEADER header;              // 定义文件头信息        
  BITMAPINFOHEADER info;                // 定义位图信息头        
  RGBQUAD rgb[256];                     // 定义调色盘,只有1、4、8位图才需要调色盘        
  unsigned char * data = nullptr;       // 定义位图数据指针        
  ~BMP()        
 {               
    if (data != nullptr)               
    {                       
     delete[] data;                       
     data = nullptr;               
    }        
 }
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现24位BMP转8位BMP,需要进行以下步骤: 首先,读取24位BMP文件的头部信息,包括文件大小、宽度、高度和颜色位数等信息。可以使用相关的bmp库或者自定义函数来读取头部信息。 接下来,创建一个新的8位BMP文件,并设置其头部信息。新文件的宽度和高度与原文件相同,但是颜色位数为8位。 然后,需要对每个像素点进行颜色转换。由于8位BMP只能表示256种颜色,而24位BMP可以表示更多的颜色,因此需要将24位颜色值映射到8位颜色值。这可以通过查表的方式实现。可以创建一个颜色映射表,包含256个颜色值,将原24位颜色对应地映射到8位颜色。 接下来,遍历所有像素点,将24位颜色值转换为对应的8位颜色值。可以使用像素点的RGB值在颜色映射表中查找对应的索引,得到8位颜色值,并将其写入新的8位BMP文件。 最后,将新的8位BMP文件保存到指定的路径中。 需要注意的是,在颜色转换过程中可能会出现颜色丢失的情况。因为8位BMP只能表示256种颜色,而24位BMP可以表示更多的颜色,所以在转换过程中,可能会出现某些颜色无法准确映射的情况。可以考虑使用一些颜色量化算法,如误差扩散等,来尽量减少颜色丢失的程度。 ### 回答2: 将24位BMP转换为8位BMP可以简单地理解为将每个像素点的RGB值转换为相应的8位灰度值。下面是一种可能的实现方法: 1. 读取24位BMP文件的头部信息,包括图像的宽度、高度和像素位深度等。 2. 创建一个新的8位BMP文件,并设置相应的头部信息,如宽度、高度和像素位深度为8位。 3. 遍历24位BMP文件中的每个像素点。 4. 对于每个像素点,获取其RGB值,即红色、绿色和蓝色的分量。 5. 将RGB值转换为灰度值,可以使用以下公式:Gray = (0.299 * R) + (0.587 * G) + (0.114 * B),其中R、G和B分别表示红、绿和蓝的分量值。 6. 将灰度值存储到新创建的8位BMP文件对应的像素点位置。 7. 重复步骤3-6,直到遍历完所有的像素点。 8. 将转换后的8位BMP文件保存到磁盘上。 这样,就完成了将24位BMP文件转换成8位BMP文件的过程。通过将RGB值转换为灰度值,可以将原本的24位色彩表示缩减为256级灰度表示,实现了从24位BMP到8位BMP的转换。 ### 回答3: 实现24位BMP转8位BMP的过程中,主要需要做以下几个步骤: 1. 首先读取24位BMP文件的头文件信息,包括图像的宽度、高度、颜色深度等信息。 2. 创建一个8位BMP文件的头文件,并将相应的信息填写进去,包括图像的宽度、高度、颜色深度等。 3. 创建一个256色的调色板,用来储存颜色索引值。这里需要注意,由于8位BMP最大只能表示256种颜色,所以需要对原始24位BMP中的所有颜色进行量化处理,将其映射到256色调色板中。 4. 逐个像素地将24位BMP图像中的RGB值映射到对应的索引值,并写入到8位BMP文件中,形成新的图像。 5. 最后保存修改后的8位BMP文件。 在实现的过程中,我们可以使用编程语言如C或Python来进行操作。通过读取和写入文件的操作,以及相应的数值处理和位运算等操作,可以实现24位BMP转8位BMP的功能。 总之,实现24位BMP转8位BMP需要读取原始BMP的图像信息,创建8位BMP文件头部和调色板,对原始颜色进行量化处理和映射,最后将映射后的颜色值写入新的8位BMP文件中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值