8位位图的存储方法

        位图的结构由4部分组成,位图文件头、位图信息头、颜色表和颜色数据,32位或者24位不需要颜色表即调色板,8位则需要填写调色板数据,另外要注意的就是8位位图的一行的跨度必须是4的整数倍,否则就显示不出正确的图形。代码如下:

BOOL SaveBitmap8(HANDLE hFile,  int  nWidth,  int  nHeight, RGBQUAD *  pRgbquad, BYTE *  pColorData)
{
        ASSERT(hFile 
!= INVALID_HANDLE_VALUE);
        ASSERT(pRgbquad 
!= NULL);
        ASSERT(pColorData 
!= NULL);
        
//一行的跨度必须为4的整数倍
        int cx = (nWidth % 4 == 0 ? nWidth : nWidth / 4 * 4 + 4);
        
//数据的大小
        DWORD dwSize = cx * nHeight * sizeof(BYTE);
        BITMAPFILEHEADER bfh;
        
//位图文件头
        bfh.bfReserved1 = 0;
        bfh.bfReserved2 
= 0;
        bfh.bfOffBits 
= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
        bfh.bfSize 
= dwSize + bfh.bfOffBits;
        bfh.bfType
= (WORD)('M' << 8| 'B';
        BITMAPINFOHEADER bih;
        
//位图信息头
        bih.biSize = sizeof(bih);
        bih.biWidth 
= nWidth;         //这里为实际的宽度
        bih.biHeight = nHeight;
        bih.biPlanes 
= 1;
        bih.biBitCount 
= 8;
        bih.biCompression 
= 0;
        bih.biSizeImage 
= dwSize;
        bih.biXPelsPerMeter 
= 0;
        bih.biYPelsPerMeter 
= 0;
        bih.biClrUsed 
= 256;
        bih.biClrImportant 
= 0;
        
//写位图文件头
        ......
        
//写位图信息头
        ......
        
//写颜色表
        ......
        
//写颜色数据
        ......
        
return TRUE;       
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值