社区
游戏开发
帖子详情
BITMAPINFOHEADER.biCompression是BI_BITFIELDS的BMP怎么解码?
tongchi
2002-09-11 08:31:13
biCompression是BI_BITFIELDS时,按MSDN上的说法这个标识用在16位和32位的BMP上,有三个DWORD作为图片数据的MASK,我试着忽略这个东东,解出来的图片色彩实在是惨不忍睹,不知道谁告诉我有这个标志的bmp该怎么解?
...全文
1600
5
打赏
收藏
BITMAPINFOHEADER.biCompression是BI_BITFIELDS的BMP怎么解码?
biCompression是BI_BITFIELDS时,按MSDN上的说法这个标识用在16位和32位的BMP上,有三个DWORD作为图片数据的MASK,我试着忽略这个东东,解出来的图片色彩实在是惨不忍睹,不知道谁告诉我有这个标志的bmp该怎么解?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wqyuwss
2002-09-13
打赏
举报
回复
这是指的图像用行城编码压缩
tongchi
2002-09-13
打赏
举报
回复
谢谢你的提醒,我已经搞定了,另外搜来的资料,也许你也有兴趣:
biBitCount=16 表示位图最多有216种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。
有机会多交流!
SkyWalkerJ
2002-09-12
打赏
举报
回复
这个,说老实话我并没有做过,但知道有那么回事,使用上应该和局域网里所用的子网掩码是一样的,Blue掩码是1的位,就是代表Blue的。三个掩码应该是放在BITMAPINFOHEADER后面的颜色表里,你可以查查MSDN。
tongchi
2002-09-12
打赏
举报
回复
SkyWalkerJ兄,我现在需要解这种格式的BMP,能不能具体讲一下这三个掩码是怎样指定的16位的图像数据的位分布?在32位中又是怎样的呢?谢了。
SkyWalkerJ
2002-09-12
打赏
举报
回复
大哥,怎么能忽略呢,这三个掩码指定了RGB三种颜色的位结构啊,就是在一个像素的16个bit中,哪几位是R,哪几位是G,哪几位是B,你忽略了它们,还怎么解码??
bmp
16位 24位 图像变换
void CExample10View::OnSave555
Bi
Bi
t
field
s() { // TODO: Add your command handler code here if(lp
Bmp
DataBuf==NULL) { MessageBox("当前没有打开的位图"); return; } BYTE r,g,b; LPBYTE lpDest,lpSrc; int i,j; int nheapSize; CFileDialog filesavebox(FALSE,"
bmp
","
BI
_
BI
T
FIELD
S.
bmp
",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"files(*.
bmp
)|*.
bmp
|",NULL); CFile file; CString strPathname; if(m_bmi.
bi
Bi
t
Count!=24) { MessageBox("当前打开的位图不是24位位图"); return; } memcpy(&m_newbmf,&m_bmf,sizeof(
BI
T
MAP
FILE
HEADER
)); memcpy(&m_newbmi,&m_bmi,sizeof(
BI
T
MAP
INFO
HEADER
)); m_newbmi.
bi
Bi
t
Count=16; m_newbmi.
bi
Compression
=
BI
_
BI
T
FIELD
S;//即3 m_newbmi.
bi
SizeImage=WIDTHBYTES(m_newbmi.
bi
Width,m_newbmi.
bi
Bi
t
Count)*m_newbmi.
bi
Height; m_newbmf.bfSize=sizeof(
BI
T
MAP
FILE
HEADER
)+sizeof(
BI
T
MAP
INFO
HEADER
)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.
bi
Width,m_newbmi.
bi
Bi
t
Count)*m_newbmi.
bi
Height; m_newbmf.bfOff
Bi
t
s=sizeof(
BI
T
MAP
FILE
HEADER
)+sizeof(
BI
T
MAP
INFO
HEADER
)+sizeof(DWORD)*3; nheapSize=sizeof(
BI
T
MAP
INFO
HEADER
)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.
bi
Width,m_newbmi.
bi
Bi
t
Count)*m_newbmi.
bi
Height; if(lpnew
Bmp
DataBuf!=NULL) { delete []lpnew
Bmp
DataBuf; lpnew
Bmp
DataBuf=NULL; } lpnew
Bmp
DataBuf=new BYTE[nheapSize]; memcpy(lpnew
Bmp
DataBuf,&m_newbmi,sizeof(
BI
T
MAP
INFO
HEADER
)); DWORD* lp=(DWORD*)(lpnew
Bmp
DataBuf+sizeof(
BI
T
MAP
INFO
HEADER
)); *lp++=0x00007c00; *lp++=0x000003e0; *lp =0x0000001f; for(i=0;i
biHeight;i++) { for(j=0;j
biWidth;j++) { lpSrc=lp
Bmp
DataBuf+sizeof(
BI
T
MAP
INFO
HEADER
) +WIDTHBYTES(m_bmi.
bi
Width,m_bmi.
bi
Bi
t
Count)*(m_bmi.
bi
Height-1-i) +j*3; lpDest=lpnew
Bmp
DataBuf+sizeof(
BI
T
MAP
INFO
HEADER
)+sizeof(DWORD)*3 +WIDTHBYTES(m_newbmi.
bi
Width,m_newbmi.
bi
Bi
t
Count)*(m_newbmi.
bi
Height-1-i) +j*2; b=*lpSrc++; b&=0xf8; g=*lpSrc++; g&=0xf8; r=*lpSrc++; r&=0xf8; WORD* lp=(WORD*)lpDest; *lp=0; *lp=r<<7; *lp+=(g<>3); } } if(filesavebox.DoModal()!=IDOK) return; strPath
位图文件(
BMP
)格式分析
一、文件格式
Bmp
文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对
bmp
文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。 首先,整个
bmp
文件的内容可以分为3到4块。之所以分为3到4块而不是固定的值,是因为,对于
bmp
来说可能存在调色板或者一些掩码。具体稍候讨论。
BMP
文件格式分析
简介
BMP
(
Bi
t
map
-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持
BMP
图象文件格式。Windows系统内部各图像绘制操作都是以
BMP
为基础的。Windows 3.0以前的
BMP
图文件格式与显示设备有关,因此把这种
BMP
图象文件格式称为设备相关位图DDB(device-dependent
bi
t
map
)文件格式。Win
bmp
文件信息头
bi
Compression
参数
BI
T
MAP
INFO
*
bi
t
map
Info
;
bi
t
map
Info
= (
BI
T
MAP
INFO
*)malloc( sizeof(
BI
T
MAP
INFO
)+sizeof(RGBQUAD)*(255) ); //printf("%d,%d\n",sizeof(
BI
T
MAP
INFO
HEADER
),sizeof(
BI
T
MAP
INFO
));40,44 memset(
bi
t
map
...
BMP
位图之代码实现
从16位开始,不存在调色板,顶多存在一个RGBQUAD的掩码。 16位位图,我没有拿到对应的素材,但是根据官方文档的描述和代码验证后,我总结为下: 当
bi
Compression
为
BI
_RGB时,此时是RGB555格式,不存在调色板。 当
bi
Compression
为
BI
_
BI
T
FIELD
S时,16位位图时RGB565格式,对应的32位是带掩码的格式,两种都有一个RGBQUAD的数据存在于调色板...
游戏开发
8,307
社区成员
23,682
社区内容
发帖
与我相关
我的任务
游戏开发
游戏开发相关内容讨论专区
复制链接
扫一扫
分享
社区描述
游戏开发相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章