
在OnPaint中进行
CDialog::OnPaint();
CDC pDC=GetDC();
for (int i=0; i<=100; i++)
{
CPen pNewPen;
pNewPenCreatePen(PS_SOLID ,1,RGB(rand()%255,rand()%255,i%255)); // 随机色
CPen poldPen=pDC->SelectObject(&pNewPen);
pDC->MoveTo(20,i4);
pDC->LineTo(300,i4);
pDC->SelectObject(poldPen);
}
首先问一下,你是用DDB(设备相关位图)还是Dib类(设备无关位图类,得自己写)进行图像处理的呢?
如果是用前者,以下是灰度处理菜单响应函数
void CBTTMAPView::256ToGray()
{
// TODO: Add your command handler code here
CDC pDC=this->GetDC(); //获得设备上下文
CRect m_rect;
this->GetClientRect(&m_rect); //获得窗口客户区
COLORREF m_color;
BYTE r,g,b;
DWORD m_gray;
for(int i=0;i<(int)(m_rectbottom);i++)
for(int j=0;j<(int)
( m_rectright);j++)
{
m_color=pDC->GetPixel(i,j); //获得颜色
r=GetRValue(m_color);
g=GetGValue(m_color);
b=GetBValue(m_color);
m_gray=(int)(038r+049g+01b);//设置灰度颜色值
m_color=RGB(m_gray,m_gray,m_gray);
pDC->SetPixel(i,j,m_color); //用灰度颜色画点
}
主要是利用CDC类对象的两个成员函数GetPixel和SetPixel来设置图像像素点的颜色值
如果用Dib类处理,实在是抱歉,由于我也是初学者,最近在用MFC做一个图像处理,不太清楚!
嗯 ~~是这样的,。
1:你知道每个像素的坐标和灰度,那就知道图像的大小,定义一个固定的二维数组,把所有像素存入其中。
color ColorBuffer[WIDTH][HEIGHT] = {0};
ColorBuffer[i][j]b = ColorBuffer[i][j]g = ColorBuffer[i][j]r = colorzhi1//当前像素值,如果RGB一样。如果不一样则单独赋值;
2: 然后SaveBmp((LPSTR)(LPCTSTR)bmpname, WIDTH,HEIGHT, (unsigned char)ColorBuffer);
把ColorBuffer中的值转化成BMP
//bmpnameFormat("E:\\8位图像%dbmp",1);
3:保存还是直接显示就看你自己了
参考SaveBmp函数: 这是vc9下的,UNC字符集的。
void CSeekerDataDlg::SaveBmp(char filename,int height,int width,unsigned char data)
// 函数名 文件名指针 文件高度 文件宽度 文件数据指针
{
unsigned int size = width height 3 + 54;
struct BMPPIC
{
BITMAPFILEHEADER bitmapfileheader;
BITMAPINFOHEADER bitmapinfoheader;
}bitmap;
//写bmp文件信息头
bitmapbitmapinfoheaderbiSize = sizeof(BITMAPINFOHEADER);
bitmapbitmapinfoheaderbiWidth = width;
bitmapbitmapinfoheaderbiHeight = height;
bitmapbitmapinfoheaderbiPlanes = 1;
bitmapbitmapinfoheaderbiBitCount = 24; //24位
bitmapbitmapinfoheaderbiCompression = 0;
bitmapbitmapinfoheaderbiSizeImage = widthwidth3;
bitmapbitmapinfoheaderbiXPelsPerMeter = 0;
bitmapbitmapinfoheaderbiYPelsPerMeter = 0;
bitmapbitmapinfoheaderbiClrUsed = 256;
bitmapbitmapinfoheaderbiClrImportant = 256;
//写文件头
bitmapbitmapfileheaderbfType = 0x4D42; // 位图文件的类型,必须为BM
bitmapbitmapfileheaderbfSize = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ heightwidth3; //位图文件的大小,以字节为单位
bitmapbitmapfileheaderbfReserved1 = 0; // 位图文件保留字,必须为0
bitmapbitmapfileheaderbfReserved2 = 0; // 位图文件保留字,必须为0
bitmapbitmapfileheaderbfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位
int totaldLine=height;
int totalArray=width;
int lpitch=bitmapbitmapinfoheaderbiSizeImage/bitmapbitmapinfoheaderbiHeight;
int ipitch=bitmapbitmapinfoheaderbiWidth(bitmapbitmapinfoheaderbiBitCount/8);
//bitmapbuffer=(UCHAR)malloc(bitmapbitmapinfoheaderbiSizeImage);
//HANDLE fh;
// fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
FILE fp = fopen(filename, "wb");
if (!fp) return;
fwrite((LPSTR)&bitmapbitmapfileheader, 1, sizeof(bitmapbitmapfileheader), fp);
fwrite((LPSTR)&bitmapbitmapinfoheader, 1,sizeof(bitmapbitmapinfoheader),fp);
fwrite(data, 1, size,fp); fclose(fp);
}
1楼说的对,识别圆就用Hough圆检测函数cvHoughCircles();至于识别颜色,无非就是写一个循环函数对每个像素判断,不麻烦。都不用二值化。
函数定义:CvSeqcvHoughCircles(CvArrimage,voidcircle_storage,
intmethod,doubledp,doublemin_dist,doubleparam1=100,doubleparam2=100,intmin_radius=0,intmax_radius=0)。
使用例子:
CvMemStoragestorage=cvCreateMemStorage(0);//定义存储器
cvCvtColor(img,gray,CV_BGR2GRAY);//将原图转换为灰度图处理
cvSmooth(gray,gray,CV_GAUSSIAN,9,9);//平滑图像
CvSeqcircles=cvHoughCircles(gray,storage,CV_HOUGH_GRADIENT,2,gray->height/4,200,100);//调用Hough圆检测函数,其中后面几个参数可以根据实际情况修改
inti;//画出检测到的所有圆。
for(i=0;i<circles->total;i++)
{
floatp=(float)cvGetSeqElem(circles,i);
cvCircle(img,cvPoint(cvRound(p[0]),cvRound(p[1])),3,
CV_RGB(0,255,0),-1,8,0);
cvCircle(img,cvPoint(cvRound(p[0]),cvRound(p[1])),
cvRound(p[2]),CV_RGB(255,0,0),3,8,0);
}
先用GetCursorPos获得当前鼠标光标的位置,再用GetPixel 函数可以获得指定坐标的像素的red, green, blue (RGB)颜色值。 查看下这些函数的用法 你就知道了 语言是VC
那个框框是VC里的通用对话框的颜色对话框。
MFC的CColorDialog类代表颜色对话框。
CColorDialog colorDialog;
int reasult = colorDialogDoModal();
//用这两行代码可以得到那个框框。这时候就可以在上面选择自己
//要用的颜色了。
if (reasult == IDOK)//如果按下颜色对话框的OK键
{
m_Color = ColorDialogGetColor();//把对话框选中的颜色给
//变量m_Color
Invalidate();//销毁当前页面,刷新到颜色修改后的页面
}
可以把以上的代码写到一个函数里,要调用颜色对话框时调用该函数
来实现颜色的改变。
以上就是关于VC++ 绘图 设置图像颜色,是那种moveto(),lineto(),改变他们改变他们画出的颜色全部的内容,包括:VC++ 绘图 设置图像颜色,是那种moveto(),lineto(),改变他们改变他们画出的颜色、VC中,读取了一个灰度图,我现在想对位图中的某个像素点颜色设置为红色,某点设置为蓝色,该怎么弄呢、现已获得各个像素点的坐标和灰度值,如何用VC++绘制位图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)