求助各位大侠:如何对象素点进行染色? 我在对一副灰度位图先二值化(0和255),再进行一些处理后,将有用点象素的灰度用128表示,现在我想将这些点染成红色,该如何进行?谢谢各位。希望各位给我代码,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CDibView::OnMenuchange() file://图像转换实现函数{ // TODO: Add your command handler code here HANDLE data1handle; LPBITMAPINFOHEADER lpBi; BITMAPINFO *m_pBMI; CDibDoc *pDoc=GetDocument(); HDIB hdib; unsigned char *hData; unsigned char *data; hdib=pDoc->GetHDIB();//得到位图数据的句柄,其中包含图像信息头 BeginWaitCursor(); lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib); hData=(unsigned char*)FindDIBBits((LPSTR)lpBi); m_pBMI=new BITMAPINFO;//生成彩色图像的信息头 m_pBMI->bmiHeader.biBitCount=24; m_pBMI->bmiHeader.biClrImportant=0; m_pBMI->bmiHeader.biClrUsed=0; m_pBMI->bmiHeader.biCompression=BI_RGB; m_pBMI->bmiHeader.biHeight=lpBi->biHeight; m_pBMI->bmiHeader.biWidth=lpBi->biWidth; m_pBMI->bmiHeader.biPlanes=1; m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); m_pBMI->bmiHeader.biXPelsPerMeter=0; m_pBMI->bmiHeader.biYPelsPerMeter=0; m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3; file://data=hData; int R,G,B,i,j; data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3); file://生成存储彩色图象数据的缓冲区 data=(unsigned char*)GlobalLock((HGLOBAL)data1handle); for(i=0;ibiHeight;i++)//实现灰度到彩色变换 for(j=0;jbiWidth*8);j++) { if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=64) {R=0; G=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)); B=255; } if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>64 && *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=128) {R=0; G=255; B=(int)4*(128-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)); } if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>128 && *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=192) {R=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)-128); G=255; B=0; } if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>192 && *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=255) {R=255; G=(int)4*(255-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)); B=0; } file://将生成的R、G、B分量存入目标缓冲区 *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3)=B; *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+1)=G; *(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+2)=R; } GlobalUnlock((HGLOBAL)hdib); GlobalUnlock(data1handle); EndWaitCursor(); CClientDC pDC(this); file://显示真彩色图像 StretchDIBits(pDC.GetSafeHdc(),0,0,lpBi->biWidth,lpBi->biHeight,0,0, lpBi->biWidth, lpBi->biHeight,data,m_pBMI,DIB_RGB_COLORS, SRCCOPY); delete m_pBMI;} 转换公式为Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j) 参考:http://www.yesky.com/422/1714422.shtml 谢谢!但是我原图是一个灰度位图可以直接对它进行RGB的赋值吗? 如果是8位灰度图是不可以的,你无论如何赋值他都不会是红色的,如果是24位灰度图是可以直接赋值的.24位就是不用调色板,把你的RGB三位都直接赋值为8位灰度里面相应的灰度值,这样你如果想将相应的点赋值为红色的话,可以将R=255,G=B=0就可以了. 这个只能用pdc->SetPixel(i,j,RGB(255,0,0));了.i,j就是对应你图像中像素的坐标,这该会了吧.不过这样刷新一下就会没有了.想刷新还有可以用双缓冲.这个你可以search一下以前的贴子.讲这个的多了.8位灰度图像修改调色板也不能将其设置为红色.我一般省事就把8位灰度图转为24位灰度图用.不过8位的好操作. 求RingSDK界面库(临风大侠)最新版 图像缩放三次卷积的意义?? 急救!VC程序被系统关闭 问各位达人一个ISAPI筛选器未加载的问题 已经载入内存中的数据如何使用? 输入法功能实现 初学者的几点迷惑------请指点 关于接口定义语言? 问个MFC的问题,回答了我把妹妹嫁给他 无内容,测试一下发送软件,不好意思! 请问动态生成的树型控件怎么响应消息函数? 对于vc6,《Visual C++技术内幕》哪一版最好!!
{
// TODO: Add your command handler code here
HANDLE data1handle;
LPBITMAPINFOHEADER lpBi;
BITMAPINFO *m_pBMI;
CDibDoc *pDoc=GetDocument();
HDIB hdib;
unsigned char *hData;
unsigned char *data;
hdib=pDoc->GetHDIB();//得到位图数据的句柄,其中包含图像信息头
BeginWaitCursor();
lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
hData=(unsigned char*)FindDIBBits((LPSTR)lpBi);
m_pBMI=new BITMAPINFO;//生成彩色图像的信息头
m_pBMI->bmiHeader.biBitCount=24;
m_pBMI->bmiHeader.biClrImportant=0;
m_pBMI->bmiHeader.biClrUsed=0;
m_pBMI->bmiHeader.biCompression=BI_RGB;
m_pBMI->bmiHeader.biHeight=lpBi->biHeight;
m_pBMI->bmiHeader.biWidth=lpBi->biWidth;
m_pBMI->bmiHeader.biPlanes=1;
m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
m_pBMI->bmiHeader.biXPelsPerMeter=0;
m_pBMI->bmiHeader.biYPelsPerMeter=0;
m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3;
file://data=hData;
int R,G,B,i,j;
data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3);
file://生成存储彩色图象数据的缓冲区
data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
for(i=0;ibiHeight;i++)//实现灰度到彩色变换
for(j=0;jbiWidth*8);j++)
{
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=64)
{R=0;
G=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
B=255;
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>64
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=128)
{R=0;
G=255;
B=(int)4*(128-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>128
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=192)
{R=(int)4*(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)-128);
G=255;
B=0;
}
if(*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)>192
&& *(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)<=255)
{R=255;
G=(int)4*(255-*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j));
B=0;
}
file://将生成的R、G、B分量存入目标缓冲区
*(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3)=B;
*(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+1)=G;
*(data+i*WIDTHBYTES(lpBi->biWidth*8)*3+j*3+2)=R;
}
GlobalUnlock((HGLOBAL)hdib);
GlobalUnlock(data1handle);
EndWaitCursor();
CClientDC pDC(this);
file://显示真彩色图像
StretchDIBits(pDC.GetSafeHdc(),0,0,lpBi->biWidth,lpBi->biHeight,0,0,
lpBi->biWidth, lpBi->biHeight,data,m_pBMI,DIB_RGB_COLORS,
SRCCOPY);
delete m_pBMI;
}
http://www.yesky.com/422/1714422.shtml
但是我原图是一个灰度位图可以直接对它进行RGB的赋值吗?