16位位图格式怎么分析?[折腾好久了] 16位位图的格式怎么分析?能否指个思路,识别所有不同情况的16位位图,并找出R、G、B三个颜色值? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 肯定是要有文件头标明这个文件的RGB是什么格式的阿,没有头文件瞎猜哪能猜的到阿 文件肯定有文件头标明这个图片文件的RGB通道是什么格式阿,没有说明瞎蒙阿,那不纯瞎鬼嘛 你说的是哪种文件格式阿? JPG?DDS? 网上都有完整的头文件格式说明阿 找个开源的位图库比如CImage看看 非压缩的16位图一般有两种:RGB565和RGB555。文件头里有关于像素格式的描述。细节可以参考《windows图形编程》袁峰 著。 同意11楼。要获得R、G、B的值可以用移位语句,这个在《windows图形编程》 里很详细,网上也有电子版下载。此外在《Windows程序设计》里也有详细的描述。 大部分和8位一样几个不一样的地方:1。分配内存 8位是(((nWidth*8+31)/32)*4) 非8位(((nWidnth*24+31)/32)*4)2。指针索引 相应改变,8位是*pfile or pfile[i*nRows+j] 16位是 *pfile red*(pfile+1) green*(pfile+2) blue其他: 每行字节,头文件nBitsCount等地方 int pitch=width+width%2; buffer[(y*pitch+x)*2] buffer[(y*pitch+x)*2+1] 两个UCHAR内,存放的是(x,y)处的颜色信息 颜色分离: 1.若bitmapinfoheader中的biCompression为BI_RGB时,为555格式,分离代码如下: UCHAR b=buffer[(i*pitch+j)*2]&0x1F; UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5); UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3; 2.若bitmapinfoheader中的biCompression为BI_BITFIELDS时,在位图数据区域前存在一个RGB掩码的描述 是3个DWORD值, 我们只需要读取其中的R或者G的掩码,来判断是那种格式。 以红色掩码为例 0111110000000000的时候就是555格式 1111100000000000就是565格式。 565格式分离代码如下: UCHAR b=buffer[(i*pitch+j)*2]&0x1F; UCHAR g=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch+j)*2]>>5); UCHAR r=buffer[(i*pitch+j)*2+1]>>3; 求一思路 ocx控件如何获得html中表单中的内容 找个理由散分。。。 mfc中如何生成一对RSA的公私钥 组合框的问题? CDialog问题 向高手请教:VC++中的soap编程!!急切等待中...... 请教一下,位集(bitsets)是什么? 灰度拉伸后图像连续显示 无视规律 你来了吗 CSocket的3个问题 自动化错误,对象库未注册 [向jameshooo提问]
袁峰 著。
1。分配内存
8位是(((nWidth*8+31)/32)*4)
非8位(((nWidnth*24+31)/32)*4)2。指针索引
相应改变,8位是*pfile or pfile[i*nRows+j]
16位是
*pfile red
*(pfile+1) green
*(pfile+2) blue其他: 每行字节,头文件nBitsCount等地方
两个UCHAR内,存放的是(x,y)处的颜色信息
颜色分离:
1.若bitmapinfoheader中的biCompression为BI_RGB时,为555格式,分离代码如下:
UCHAR b=buffer[(i*pitch+j)*2]&0x1F; UCHAR g=(((buffer[(i*pitch+j)*2+1]<<6)&0xFF)>>3)+(buffer[(i*pitch+j)*2]>>5); UCHAR r=(buffer[(i*pitch+j)*2+1]<<1)>>3;
2.若bitmapinfoheader中的biCompression为BI_BITFIELDS时,在位图数据区域前存在一个RGB掩码的描述 是3个DWORD值,
我们只需要读取其中的R或者G的掩码,来判断是那种格式。 以红色掩码为例 0111110000000000的时候就是555格式
1111100000000000就是565格式。 565格式分离代码如下:
UCHAR b=buffer[(i*pitch+j)*2]&0x1F; UCHAR g=(((buffer[(i*pitch+j)*2+1]<<5)&0xFF)>>2)+(buffer[(i*pitch+j)*2]>>5); UCHAR r=buffer[(i*pitch+j)*2+1]>>3;