8位灰度图像BMP的保存
来源:互联网 发布:深圳市三人行网络 诈骗 编辑:程序博客网 时间:2024/05/20 10:56
在讲解颜色转换之前,我们要先对位图的颜色表示方式做一了解。位图中通常是用RGB三色方式来表示颜色的(位数很少时要使用调色板) 。所以每个像素采用不同的位数,就可以表示出不同数量的颜色。如下图所示:
每像素的位数
一个像素可分配到的颜色数量
1
2^1 = 2
2
2^2 = 4
4
2^4 = 16
8
2^8 = 256
16
2^16 = 65,536
24
2^24 = 16,777,216
从中我们可以看出,当使用24位色(3个字节)时,我们可以得到1600多万种颜色,这已经非常丰富了,应该已接近人眼所能分辨的颜色了。现在计算机中使用最多的就是24位色,别外在GDI+中还有一种32位色,多出来的一个通道用来描述Alpha,即透明分量。
24位色中3个字节分别用来描述R,G,B三种颜色分量,我们看到这其中是没有亮度分量的,这是因为在RGB表示方式中,亮度也是直接可以从颜色分量中得到的,每一颜色分量值的范围都是从0到255, 某一颜色分量的值越大,就表示这一分量的亮度值越高,所以255表示最亮,0表示最暗。那么一个真彩色像素点转换为灰度图时它的亮度值应该是多少呢,首先我们想到的平均值,即将R+G+B/3。但现实中我们使用的却是如下的公式:
Y = 0.299R+0.587G+0.114B
这个公式通常都被称为心理学灰度公式。这里面我们看到绿色分量所占比重最大。因为科学家发现使用上述公式进行转换时所得到的灰度图最接近人眼对灰度图的感觉。
因为灰度图中颜色数量一共只有256种(1个字节),所以转换后的图像我们通常保存为8位格式而不是24位格式,这样比较节省空间。而8位图像是使用调色板方式来保存颜色的。而不是直接保存颜色值。调色板中可以保存256颜色,所以可以正好可以将256种灰度颜色保存到调色版中。下面是个私人例子:
BITMAPFILEHEADER targetfileheader;BITMAPINFOHEADER targetinfoheader;
memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));
memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));
//构造灰度图的文件头
targetfileheader.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
targetfileheader.bfSize=192*192+sizeof(RGBQUAD)*256 +sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
targetfileheader.bfReserved1=0;
targetfileheader.bfReserved2=0;
targetfileheader.bfType=0x4d42;
//构造灰度图的信息头
targetinfoheader.biBitCount=8;
targetinfoheader.biSize=sizeof(BITMAPINFOHEADER);
targetinfoheader.biHeight=192;
targetinfoheader.biWidth=192;
targetinfoheader.biPlanes=1;
targetinfoheader.biCompression=BI_RGB;
targetinfoheader.biSizeImage=0;
targetinfoheader.biXPelsPerMeter=0;
targetinfoheader.biYPelsPerMeter=0;
targetinfoheader.biClrImportant=0;
targetinfoheader.biClrUsed=0;
//构造灰度图的调色版
RGBQUAD rgbquad[256];
int i;
for(i=0;i<256;i++)
{
rgbquad[i].rgbBlue=i;
rgbquad[i].rgbGreen=i;
rgbquad[i].rgbRed=i;
rgbquad[i].rgbReserved=0;
}
BYTE* targetbuf;
targetbuf=new BYTE[192*192];
//由于BMP图像对于行是倒置的,即图像显示的第一行是最后一行数据,所以要倒置,这里的pcutface已经////是灰度图像了
for(long i=191;i>=0;i--)
{
for(long j=0;j<192;j++)
{
targetbuf[i*192+j]=pcutface[(191-i)*192+j];
}
}
CFile cf;
if(!cf.Open(LPCTSTR("f:\\fire.BMP"),CFile::modeCreate|CFile::modeWrite))
return ;
cf.Write(&targetfileheader,sizeof(BITMAPFILEHEADER));
cf.Write(&targetinfoheader,sizeof(BITMAPINFOHEADER));
cf.Write(&rgbquad,sizeof(RGBQUAD)*256);
cf.Write(targetbuf,192*192); //这里targetbuf的大小为192x192
cf.Close();
- 8位灰度图像BMP的保存
- 8位灰度图像BMP的保存
- 8位灰度图像BMP的保存
- 8位灰度图像BMP的保存
- 8位灰度图像BMP的保存
- 8位灰度图像BMP的保存(很好的一篇文章)
- 24位bmp图像转成灰度图像
- 16位TIFF灰度图像转存BMP图像总结
- 灰度图像的8位平面分解
- bmp保存灰度图
- BMP图像的灰度化---C++实现
- 使用GDI+保存图像为8bpp的灰度图像
- 【数字图像处理】<纯C++>读取、裁剪、缩放、旋转和存储8位bmp灰度图像
- 【数字图像处理】<纯C++>读取、裁剪、缩放、旋转和存储8位bmp灰度图像
- BMP--24位真彩色转换为灰度图像
- C# 生成8位灰度图bmp
- BMP图像灰度化
- bmp位图文件:读取、写入、24位真彩转8位灰度、灰度图的二值化
- Vim skills
- 如何判断是否已经引入某个css或是js
- Oracle bitand( )函数使用
- VC基于MSCOMM控件串口通讯
- 谈谈 62进制 解决 数字加密 的方法
- 8位灰度图像BMP的保存
- arcgis 9.3 安装步骤
- wakelock的使用
- 华为S5700设置端口镜像
- 解决IE8js中不支持trim的小方法
- 在Extjs中使用iframe以及手动刷新iframe
- sqlite文件被占用,如何解决
- typedef的用法总结
- java获取Oracle数据库连接的两种方式案例