一个关于灰度图的问题......

zhsupperviol 2011-08-22 11:05:18
我想对图像进行灰度化,然后将图像输出,但是输出的图像并没有灰度化,而且图像的颜色改变了,不是原图的颜色.......

附上代码:
void CRecView::OnRec()
{
// TODO: 在此添加命令处理程序代码
//获取图像的宽度和高度
CSize sizeRec;
sizeRec=m_pDibRec->GetDimensions();
//获取图像存储的高度和宽度
CSize sizeSaveRec;
sizeSaveRec=m_pDibRec->GetDibSaveDim();

LPBYTE lpSrc, lpDst;
lpDst = new BYTE[sizeRec.cx*sizeRec.cy];
//获取图像的数据区
lpSrc=(LPBYTE)m_pDibRec->m_lpImage;
memcpy(lpDst,lpSrc, sizeRec.cx*sizeRec.cy);

RGBQUAD * pRGBPalette;
LPBYTE lpBuffer=m_pDibRec->m_lpImage;
pRGBPalette=(RGBQUAD*)&lpBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
BYTE byteMap[256];
for (int i=0;i<256;i++)
{
byteMap[i]=(BYTE)pRGBPalette->rgbRed*0.299+(BYTE)pRGBPalette->rgbGreen*0.587+(BYTE)pRGBPalette->rgbBlue*0.114;

pRGBPalette->rgbRed=i;
pRGBPalette->rgbGreen=i;
pRGBPalette->rgbBlue=i;
pRGBPalette->rgbReserved=0;
}


for (int i=0;i<sizeRec.cy;i++)
{
for (int j=0;j<sizeRec.cx;j++)
{
BYTE temp=lpSrc[sizeRec.cx*i+j];
lpDst[sizeRec.cx*i+j]=byteMap[temp];
}
}



memcpy(lpSrc, lpDst, sizeRec.cx*sizeRec.cy);

Invalidate();
}
...全文
113 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlanLinZL 2011-09-24
  • 打赏
  • 举报
回复
每一付位图都有自己带的调色板数据。灰度图一般是256级(0级对应0--RGB值都为0,1级对应1--RGB值都为0。...) 位图文件中的数据实际上是对应调色板中的索引。你可能没有处理好灰度图的调色板。

参考 谢凤英 的一本书吧,里面有详细的程序,我研究过里面的代码。

我自己也想很忙,就不帮你了。
zhsupperviol 2011-08-23
  • 打赏
  • 举报
回复
不是很明白你的话.........那应该要怎么写呢???
icansaymyabc 2011-08-23
  • 打赏
  • 举报
回复
你的代码似乎是把图片当作调色板模式来处理并修改了调色板的颜色。

问题是你能确保该图片在内存中确实是以调色板模式存在的吗?支持调色板的显卡现在可不好找了。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧