BITMAP BITMAPINFO BITMAPINFOHEADER


BITMAP : 

The BITMAP structure structure defines the height, width, color format, and bit values of a logical bitmap.

该结构定义了逻辑位图的高度、宽度、颜色格式和位值。

/* Bitmap Header Definition */
typedef struct tagBITMAP
  {
    LONG        bmType;//指定了位图的类型,对于逻辑位图该参数必须为0
    LONG        bmWidth;//指定了位图的宽度(以字节为单位),必须大于0
    LONG        bmHeight;//指定了位图的高度(以字节为单位),必须大于0</span>
    LONG        bmWidthBytes;//每行字节数,4位对齐
    WORD        bmPlanes;//指定了颜色平面数
    WORD        bmBitsPixel;//指定了每个像素的位数,比如RGB每个像素占3个字节,即24位
    LPVOID      bmBits;//指向位图数据内存的地址
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;


BITMAPINFO :

The BITMAPINFO structure defines the dimensions and color information for a DIB.

该结构定义了DIB(设备无关位图)的大小和颜色信息。

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;//一个BITMAPINFOHEAD结构体,它包含了关于大小尺寸和颜色格式信息
    RGBQUAD             bmiColors[1];//1、RGBQUAD数组,每个项组成了颜色表 2、16位无符号整型数组,指定了当前以实现的逻辑调色板的索引
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;


BITMAPINFOHEADER

The BITMAPINFOHEADER structure contains information about the dimensions and color format of a DIB.
该结构包含了一些关于DIB大小尺寸和颜色格式的信息。
typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;//该结构体所要求的字节数
        LONG       biWidth;//位图的宽度,以字节为单位
        LONG       biHeight;//位图的高度,以字节为单位
        WORD       biPlanes;//目标设备的平面数,必须为1
        WORD       biBitCount;//每个像素的位数
        DWORD      biCompression;//位图的压缩类型
        DWORD      biSizeImage;//位图的大小,以字节为单位
        LONG       biXPelsPerMeter;//位图水平分辨率,以每米多少像素为单位
        LONG       biYPelsPerMeter;//位图垂直分辨率,以每米多少像素为单位</span>
        DWORD      biClrUsed;//位图实际所使用的颜色的数量
        DWORD      biClrImportant;//显示位图时所需要的颜色(指数)的数量,如果为0那么所有的颜色都被需要
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
windows平台上支持BITMAPCOREHEADERBITMAPINFOHEADERBITMAPV4HEADERBITMAPV5HEADER四种类型位图的类库! 简单用法举例: DibBitmap bmp,ret,tmp; bmp.Open(_T("E:\\bmp.bmp"));//打开 bmp.ConvertBit(4,ret);//为4位位图,ret保存返回值 ret.RotateLeft(tmp);//向左旋90度,tmp保存返回值 tmp.Invert();//所有像素反色,即RGB(1,2,3)变为RGB(254,253,252) tmp.At(10,10)=tmp.At(20,20);//单个像素点的取值和赋值操作 tmp.At(10,20)=ret.At(30,30);//注意,设置成的颜色如果颜色表内不存在,会设置成相近色 tmp.At(20,10)=RGB(255,0,0); bmp.AlphaBlend(0,0,tmp,128,RGB(255,255,255),true);//tmp以透明度128画到bmp的(0,0)处,其中tmp中的白色会镂空 bmp.Mirror();//bmp水平翻 bmp.ConvertBit(16,ret,true);//为5-6-5型16位位图,ret保存返回值 ret.SetClipbrd();//存入剪切板中 ret.Save(_T("E:\\bmp2.bmp"));//保存到文件 该类的头文件接口大致如下: class DibBitmap { BITMAPFILEHEADER* m_pbmfh; DWORD m_size;//保存m_pbmfh中malloc出来的内存大小,即是capacity//不为0时保证图像是可以处理的 public: enum BmType{NONE=0,CORETYPE,INFOTYPE,V4TYPE,V5TYPE}; public: class reference { //略.. }; public://DibBitmap01.cpp DibBitmap(); explicit DibBitmap(LPCTSTR pstrFileName); explicit DibBitmap(BITMAPFILEHEADER* pbmfh);//只是简单的赋值给成员变量m_pbmfh DibBitmap(HDC hdc, HBITMAP hBitmap, int BitCount);//1,4,8;16,24,32 DibBitmap(const DibBitmap& rhs); ~DibBitmap(); bool Open(LPCTSTR pstrFileName);//打开失败会Close() bool Save(LPCTSTR pstrFileName)const; void Close(); void Swap(DibBitmap& rhs); DibBitmap& operator=(const DibBitmap& rhs);//不一定申请过新内存 public://DibBitmap01.cpp BITMAPFILEHEADER* Get();//获取文件头 const BITMAPFILEHEADER* Get()const; BITMAPINFOHEADER* GetInfoHead();//获取信息头 const BITMAPINFOHEADER* GetInfoHead()const; RGBQUAD* GetQuad();//获取颜色表//没有颜色表,则返回NULL const RGBQUAD* GetQuad()const; BYTE* GetByte();//获取图素位 const BYTE* GetByte()const; bool GetMask(DWORD* dwMask,bool b565=false)const; //dwMask个数为四,需要屏蔽码时,依次存入RGB屏蔽码,并返回true //当为BITMAPV4HEADER以上时,还存入AlphaMask;b565参数同GetClr bool Attach(BITMAPFILEHEADER* pbmfh); BITMAPFILEHEADER* Detach();//返回值最后须free掉 HBITMAP CreateBitmap(HDC hdc)const;//返回值最后须DeleteObject掉 HBITMAP CreateDibSection ()const;//返回值最后须DeleteObject掉 BmType Type()const; DWORD Capacity()const;//返回m_size的值//注意,此值可能小于实际malloc的内存长度 DWORD FileSize()const;//整个文件的大小//不是返回m_size的值,m_size的值大于等于此返回值 DWORD BitsSize()const;//图素位的大小,即去掉文件头,信息头和颜色表之后的大小 DWORD Offset()const;//图素位的偏移量 LONG Width()const; LONG Height()const;//可能为负值 WORD Planes()const; WORD BitCount()const; DWORD ClrUsed()const; //一般是4,8位图才小于2^(4,8),其余的等于对应颜色数,m_pbmfh为空时返回0,32位图时,返回-1,16位555位图颜色数按565算 public://DibBitmap02.cpp LPTSTR DisplayDibHeader (LPTSTR szBuffer)const;//szBuffer得大于1200个//返回szBuffer RGBQUAD GetClr(size_t x,size_t y,bool b565=false)const; //获取(x,y)处的颜色值,已考虑方向问题,b565只有在16位深位图且没有屏蔽码时才有用,指明是5-5-5还是5-6-5 COLORREF GetRGBClr(size_t x,size_t y,bool b565=false)const;//条件同上//返回的最高位为0 bool GetClipbrd(HWND hwnd);//失败不一定会Close() void SetClipbrd(HWND hwnd)const; //If hwnd is NULL, the open clipboard is associated with the current task. void Mirror(bool bHoriz);//镜像//false表示垂直镜像 public://DibBitmap03.cpp void Invert(bool b565=false);//反色//在这里b565参数不起任何作用 RGBQUAD Invert(size_t x,size_t y,bool b565=false);//(x,y)处的颜色反色,返回反色后的近似颜色 RGBQUAD SetClr(size_t x,size_t y,RGBQUAD quad,bool b565=false);//设置颜色,返回设置成的最相近的颜色 COLORREF SetRGBClr(size_t x,size_t y,COLORREF clr,bool b565=false);//设置颜色,返回设置成的最相近的颜色 //以下两个函数相当牛逼,可直接引用修改颜色 COLORREF At(size_t x,size_t y,bool b565=false)const;//获取(x,y)处的颜色 reference At(size_t x,size_t y,bool b565=false);//获取(x,y)处的颜色引用,可直接进行修改 void AlphaBlend(int x,int y,const DibBitmap& rhs,BYTE bAlpha,COLORREF clr,bool bClr=false,bool b565=false); //把rhs以透明度bAlpha画到this中的(x,y)处(可以为负),注意:当&rhs==this时直接返回,啥也不操作 //若bClr为true,则clr参数有用,rhs中颜色值为clr的像素点完全透明 void RotateLeft(DibBitmap& ret)const; //this旋(逆时针90度)后存入ret中,若this原先为空,则不改变ret,注意:当&ret==this时直接返回,啥也不操作 void RotateRight(DibBitmap& ret)const; //this旋(顺时针90度)后存入ret中,若this原先为空,则不改变ret,注意:当&ret==this时直接返回,啥也不操作 void RotateOpposite();//旋180度,注意后面没有const,此函数是旋自身 public://DibBitmap04.cpp bool ConvertBit(WORD BitCount,DibBitmap& ret,bool b565=false)const; //为同类型的不同位数位图//1,4,8;16,24,32,注意:当&ret==this时直接返回,啥也不操作 }; 说明: 此类支持四种位图格式: BITMAPCOREHEADERBITMAPINFOHEADERBITMAPV4HEADERBITMAPV5HEADER。 该类像素点坐标序号从0开始,原点位于位图左上角,不管位图信息头的高度字段是否为负,内部都已作化处理 暂不支持这四种位图的以下几种情况: 1、biCompression字段为BI_RLE4,BI_RLE8,BI_JPEG,BI_PNG的位图; 2、BITMAPV5HEADER时,bV5CSType字段等于PROFILE_LINKED或PROFILE_EMBEDDED时的位图。 有问题联系:[email protected]
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
MFC中可以使用CBitmap类来显示BITMAPINFO格式的图像。具体步骤如下: 1. 定义一个BITMAPINFO结构体,并初始化其中的成员变量,例如: ```cpp BITMAPINFO bmpInfo; ZeroMemory(&bmpInfo, sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = 640; // 图像宽度 bmpInfo.bmiHeader.biHeight = -480; // 图像高度(负数表示倒置) bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 24; // 每个像素点占用的位数,此处为24位真彩色 bmpInfo.bmiHeader.biCompression = BI_RGB; ``` 2. 加载图像数据到内存中,例如: ```cpp BYTE* pImgData = new BYTE[640 * 480 * 3]; // 图像数据大小为640*480*3字节 // 从文件中读取图像数据 FILE* fp = fopen("test.bmp", "rb"); fseek(fp, 54, SEEK_SET); // BMP文件头大小为54字节 fread(pImgData, 1, 640 * 480 * 3, fp); fclose(fp); ``` 3. 创建一个CBitmap对象,并使用SetBitmapBits函数将图像数据传入,例如: ```cpp CBitmap bmp; bmp.CreateBitmap(640, 480, 1, 24, pImgData); bmp.SetBitmapBits(640 * 480 * 3, pImgData); ``` 4. 将CBitmap对象显示在界面上,例如: ```cpp CClientDC dc(this); // 获取当前窗口的设备上下文 CDC memDC; memDC.CreateCompatibleDC(&dc); // 创建一个与设备上下文兼容的内存上下文 memDC.SelectObject(&bmp); // 将CBitmap对象选入内存上下文 dc.BitBlt(0, 0, 640, 480, &memDC, 0, 0, SRCCOPY); // 将内存上下文中的图像复制到设备上下文中显示 ``` 完整示例代码如下: ```cpp BITMAPINFO bmpInfo; ZeroMemory(&bmpInfo, sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = 640; bmpInfo.bmiHeader.biHeight = -480; bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 24; bmpInfo.bmiHeader.biCompression = BI_RGB; BYTE* pImgData = new BYTE[640 * 480 * 3]; FILE* fp = fopen("test.bmp", "rb"); fseek(fp, 54, SEEK_SET); fread(pImgData, 1, 640 * 480 * 3, fp); fclose(fp); CBitmap bmp; bmp.CreateBitmap(640, 480, 1, 24, pImgData); bmp.SetBitmapBits(640 * 480 * 3, pImgData); CClientDC dc(this); CDC memDC; memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&bmp); dc.BitBlt(0, 0, 640, 480, &memDC, 0, 0, SRCCOPY); delete[] pImgData; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值