怎样把一个24位的灰度图转为8位的图?要gdi/gdi+两种方式实现
如题 问题点数:0、回复次数:7Top
1 楼fanoble(fanoble)回复于 2004-09-04 13:17:10 得分 0
24位的灰度图?Top
2 楼CaptainIII(山上人)回复于 2004-09-04 13:50:07 得分 0
24bit bmp change to 8bit bmp?Top
3 楼Z27149(卧底)回复于 2004-09-04 14:58:12 得分 0
对,24位bmp->8位bmpTop
4 楼puhuofeie(扑火飞蛾)回复于 2004-09-04 15:43:01 得分 0
GDI+我不会。
24位转8位。。。
我有个函数。
不知道是否满足楼主的要求!
/仅对8位,24位图像进行灰度处理,将灰度图存为 8 位,并赋值处理数组。
void CDib::Gray()
{
long linebits = WIDTHBYTES(8*m_nWidth);
//分配处理数组内存
if(!m_pDataS)
{
m_pDataS = new double[linebits*m_nHeight];
}
unsigned char bitCount=GetBitCount();
// 灰度映射表
unsigned char bMap[256];
if(bitCount==8)
{
for(int i=0;i<256;i++)
{
bMap[i]=(unsigned char)(0.299*m_pRGBQuad[i].rgbRed+
0.587*m_pRGBQuad[i].rgbGreen+
0.114*m_pRGBQuad[i].rgbBlue+0.5);
m_pRGBQuad[i].rgbRed=i;
m_pRGBQuad[i].rgbGreen=i;
m_pRGBQuad[i].rgbBlue=i;
m_pRGBQuad[i].rgbReserved=0;
}
// 更换每个象素的颜色索引(即按照灰度映射表换成灰度值)
long lw=WIDTHBYTES(m_nWidth*8);
for(long j=0l;j<m_nHeight;j++)
{
for(long i=0l;i<m_nWidth;i++)
{
long jj=j*lw+i;
m_pDibData[jj]=bMap[m_pDibData[jj]];
m_pDataS[j*m_nWidth+i]=(double)bMap[m_pDibData[jj]];
}
}
}
else if(bitCount==24)
{
//计算相应的 8 位图大小
unsigned long dwFileSize = sizeof(BITMAPFILEHEADER) + m_pBitmapInfoHeader->biSize
+ 256 * sizeof(RGBQUAD) + WIDTHBYTES(m_nWidth*8) * m_nHeight;
//写 BITMAPFILEHEADER
BITMAPFILEHEADER bfh;
memcpy(&bfh,m_pBitmapFileHeader,sizeof(BITMAPFILEHEADER));
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + m_pBitmapInfoHeader->biSize
+ 256 * sizeof(RGBQUAD);
bfh.bfSize = dwFileSize;
m_fileLeng = dwFileSize;
//写 BITMAPINFOHEADER
BITMAPINFOHEADER bih;
memcpy(&bih,m_pBitmapInfoHeader,m_pBitmapInfoHeader->biSize);
bih.biBitCount = 8;
bih.biSizeImage = (unsigned long)WIDTHBYTES(m_nWidth*8) * (unsigned long)m_nHeight;
bih.biClrUsed = 256;
//写 RGBQUAD
RGBQUAD rgbq[256];
for(int i=0;i<256;i++)
{
rgbq[i].rgbRed=i;
rgbq[i].rgbGreen=i;
rgbq[i].rgbBlue=i;
rgbq[i].rgbReserved=0;
}
//写位图数据
unsigned char* pData = new unsigned char[bih.biSizeImage];
long lw=WIDTHBYTES(m_nWidth*24);
for(long j=0l;j<m_nHeight;j++)
{
for(long i=0l;i<m_nWidth;i++)
{
long jj=j*lw;
long ii=3*i;
unsigned char gray = (unsigned char)(0.299*(m_pDibData[jj+ii])+
0.587*(m_pDibData[jj+ii+1])+0.114*(m_pDibData[jj+ii+2])+0.5);
pData[j*linebits+i] = gray;
m_pDataS[j*linebits+i] = gray;
}
}
//重新申请内存文件
m_pFileData = m_memFile.Detach();
ASSERT(m_pFileData = (BYTE *) realloc((void * )m_pFileData,dwFileSize));
m_memFile.Attach(m_pFileData,dwFileSize, GROWBYTES);
m_memFile.Seek(0l,CFile::begin);
m_memFile.Write(&bfh,sizeof(BITMAPFILEHEADER));
m_memFile.Write(&bih,sizeof(BITMAPINFOHEADER));
m_memFile.Write(rgbq,256 * sizeof(RGBQUAD));
m_memFile.Write(pData,bih.biSizeImage);
SetPara();
delete[] pData;
}
}
还有一些相关的函数,如果楼主觉得可以,我可以把这个CDib类给你。
Top
5 楼Z27149(卧底)回复于 2004-09-04 15:59:01 得分 0
谢谢~~~
zaqizaba001@163.comTop
6 楼keiy()回复于 2004-09-04 16:18:58 得分 0
http://www.chinaoak.com/download/sources/multimedia.htm
其中imageedit2有你要的Top
7 楼CaptainIII(山上人)回复于 2004-09-05 11:58:35 得分 0
gdi+应该很简单,算法已经提供,各种格式的转换.Top
相关问题
- 请问如何把有灰度的图片转为黑白的?
- 如何实现将灰度图像转换伪彩色图像????
- 帮忙看一下这个把555的16bit图像转为8bit(256灰度)图像的函数哪里错啦?
- 我是一个新人,现在急需VC++或BCB把彩图转为灰度的代码
- 图像问题 请问如何把 真彩图像 分别转为 256色索引图 和 灰度图
- 请问怎么编程实现24bit BMP file转化为256色 灰度
- 请问怎么编程实现24bit BMP file转化为256色 灰度
- javascript在客户端如何实现任意调节图片的灰度?
- 如何用VC实现,彩色图像转化成灰度图像?我的分数太多了,一定给分。
- C#的ASP.NET中如何实现将字符串转为ASCII,将ASCII转为字符串?急!!!




