如何用VC实现,彩色图像转化成灰度图像?我的分数太多了,一定给分。

nice521 2002-04-21 06:21:05
转化后的灰度图像应该是原来彩色图像的1/3。
各位大哥,谢谢帮忙!
...全文
711 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
cwsuperman 2002-04-23
  • 打赏
  • 举报
回复
先用公式A*R.....
然后再R=g=b=.....
然后自己构造Dib
然后自己构造Bitmap.............
duwenyong 2002-04-23
  • 打赏
  • 举报
回复
怎么找到?这我怎么说呀,我一般在www.google.com搜索的,这个网站的搜索引擎技术是very good。分收到了,谢谢!
chenhq 2002-04-23
  • 打赏
  • 举报
回复
void CMainDoc::Convert24to8(HDIB hdib)
{
DWORD dwLen;
BYTE *ptr1;
BYTE *ptr2;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE hTempImage = NULL;
LPRGBQUAD lprgb;
register int j,i;
if( hdib == 0 )
return ;
dwLen = GlobalSize (hdib);
DibInfo (hdib, &bi);
if(bi.biBitCount!=24)
return;
bi.biWidth = (WORD)( (bi.biWidth + 3) /4 ) * 4;
dwLen = bi.biSize + 1024+bi.biHeight*bi.biWidth;
hTempImage = ::GlobalAlloc(GHND, dwLen);
ptr1 = (BYTE *)GlobalLock(hdib);
ptr2 = (BYTE *)GlobalLock(hTempImage);
lpbi = (LPBITMAPINFOHEADER)ptr2;
lpbi->biSizeImage = bi.biHeight*bi.biWidth;
lpbi->biPlanes = bi.biPlanes;
lpbi->biSize = bi.biSize;
lpbi->biWidth = bi.biWidth;
lpbi->biHeight = bi.biHeight;
lpbi->biClrUsed = 256;
lpbi->biBitCount = 8;
ptr2 += bi.biSize ;
lprgb = (LPRGBQUAD)ptr2;
for( j=0;j<256;j++,lprgb++ )
{
lprgb->rgbBlue = j; // fill in 256 gray
lprgb->rgbGreen = j;
lprgb->rgbRed = j;
lprgb->rgbReserved = 0;
}
ptr1 += bi.biSize;
ptr2 += 1024;
//Y = 0.299*R + 0.587*G + 0.114*B
for( j=0;j<bi.biHeight*bi.biWidth;j++ )
{
*ptr2 = (int)((*ptr1)*0.114 + (*(ptr1+1))*0.587 + (*(ptr1+2))*0.299);
ptr1+=3 ;
ptr2++;
}
GlobalUnlock(hTempImage);
GlobalFree(hdib);
hdib = (HDIB)CopyHandle(hTempImage );
GlobalFree( hTempImage);
}
本过程直接加入VC范例DIBLOOK中可以直接使用,其他的如图像存储,图像读取,在DIBLOOK中都有范例,在GENERAL目录下
nice521 2002-04-23
  • 打赏
  • 举报
回复
收到分了吧!
nice521 2002-04-23
  • 打赏
  • 举报
回复
网站很好,请问是怎么找到的?
duwenyong 2002-04-23
  • 打赏
  • 举报
回复
http://asp.6to23.com/iseesoft/now.htm
http://xautdiph.51.net/index.html
http://202.38.68.76/
http://www-scf.usc.edu/~flv/ipbook/
http://wannaplay.51.net/articles.html
这几个还不错吧,你去看看,谢谢就免了,十几天前我也是到CSDN来问一堆问题的,CSDN上的人就是与众不同
gaog 2002-04-23
  • 打赏
  • 举报
回复
这个再简单不过,把RGB转成YUV, 而期中的Y分量就是灰度图
公式如下:
Y = 0.3R + 0.6G + 0.1B
nice521 2002-04-23
  • 打赏
  • 举报
回复
收到,在看程序,晚上一定给分。
多问一个问题,学习vc中图像处理得比较好的网站有那些?
多谢指导!
duwenyong 2002-04-23
  • 打赏
  • 举报
回复
我自己写了一个,给你发了,查收,别忘了给分呀,呵呵
ttzzgg_80713 2002-04-23
  • 打赏
  • 举报
回复
mark
blue_flash 2002-04-23
  • 打赏
  • 举报
回复
都说的好清楚了
nice521 2002-04-23
  • 打赏
  • 举报
回复
TO chenhq(chenhq)
程序出错了error C2065: 'DibInfo' : undeclared identifier
谢谢纠正,我一直在线。

nice521 2002-04-23
  • 打赏
  • 举报
回复
TO chenhq(chenhq)
程序出错了,
'DibInfo' : undeclared identifier
谢谢纠正!
我一直在线。
nice521 2002-04-22
  • 打赏
  • 举报
回复
to Thalses(平四)
谢谢,我真的很需要
scolianice521@sina.com
Thalses 2002-04-22
  • 打赏
  • 举报
回复
自己写一个X级灰度的调色板,台体原来的不就行了?
我有一个源码,图像处理课上做的,要的话发给你,
不过是在一个VC的程序中(有一些别的处理功能),你自己扒一下吧.
nice521 2002-04-22
  • 打赏
  • 举报
回复
应该是ColortoGrayScale(HWND hWnd),但是我不知道hWnd这个参数怎么来?
我一直在等待。谢谢!
duwenyong 2002-04-22
  • 打赏
  • 举报
回复
那好,我晚上没空了,明晚帮你转化,明早得工作没办法了。看你能不能等啦。
其实主要在那个TrueTo256那个函数了。
nice521 2002-04-22
  • 打赏
  • 举报
回复
谢谢,收到了,可是那个程序使用windows c方式写的,该怎么转化成在vc上实现呢?
转化的过程很好像很复杂的阿
oldj123 2002-04-22
  • 打赏
  • 举报
回复
两种方法:1、图像减色处理,将24位图像减色为256色图(有经典的八叉树算法等),再将调色板中的R=G=B=0.30*R+0.59*G+0.11*B
2、先将R=G=B=0.30*R+0.59*G+0.11*B,即先去除亮度信息,相当与转化为256色,再自建一个DIB,对象(灰度的),用24位图每一点的R值去填充DIB的位数据区,就可以了,至于调色板,随便弄一个呀!例如:
for(i=0;i<256;i++)
{lpbmi->bmiColors[i].rgbRed=i;
lpbmi->bmiColors[i].rgbGreen=i;
lpbmi->bmiColors[i].rgbBlue=i;
lpbmi->bmiColors[i].rgbReserved=i;
}
其中lpbmi为你新建DIB的BITMAPINFO指针!
我编过一个函数用的是第二种方法,你要我可以给你!
duwenyong 2002-04-22
  • 打赏
  • 举报
回复
是没内容呀,但有附件呀?好,好,我再发一次
加载更多回复(9)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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