VC++ 绘图 设置图像颜色,是那种moveto(),lineto(),改变他们改变他们画出的颜色

VC++ 绘图 设置图像颜色,是那种moveto(),lineto(),改变他们改变他们画出的颜色,第1张

在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++绘制位图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9564424.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存