vc图像处理代码(vc图像处理代码是什么)[20240504更新]
admin 发布:2024-05-04 13:32 108
本篇文章给大家谈谈vc图像处理代码,以及vc图像处理代码是什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
求VC++把图片变成马赛克效果代码
这是老师给的高大上的东西:
void SpecialEffectShow::Mosaik(CDC *pDC)
{
int bitmapWidth=GetDimensions().cx;//获得源图象的宽度,以象素为单位
int bitmapHeight=GetDimensions().cy;//获得源图象的高度,以象素为单位
CRect rect(0,0,bitmapWidth,bitmapHeight);//以源图象的尺寸创建一个矩形
CBrush brush(RGB(255,255,255)); //设置画刷为白色
pDC-FillRect(rect,brush);//将已经显示出来的原图象重新设置成白色,达到刷新屏幕的效果
LPBITMAPINFO pBitmapInfo=(BITMAPINFO*)m_lpBmpInfoHead;
//为适应StretchDIBits函数的需要,将图像信息头指针强制转换为LPBITMAPINFO类型
//马赛克的大小设置为宽高都是12个像素
int WithFalg=0; //图象宽是12的整数倍的标志
int HeightFlag=0;//图象高是12的整数倍的标志
if((bitmapWidth%12)!=0)WithFalg=1;
if((bitmapHeight%12)!=0)HeightFlag=1;
long ArrayLength=(bitmapWidth/6+WithFalg)*(bitmapHeight/6+HeightFlag);
//将图象宽高都延拓至12的整数倍,然后将图象分成12X12的小块,按行顺序排列成一个数组
struct Square
{
CPoint pt;//记录每个12X12的小块的左上角坐标
bool HitFlag;//当随机扫描所有小块的时候,记录是否曾经被扫描过
};//自己定义一个结构,由一个Cpoint类型和一个击中标志构成
Square* SquareArray=new Square[ArrayLength];
int x=0;
int y=0;
for(int i=0; iArrayLength; i++)
{
//初始化每个小块的坐标点
SquareArray[i].pt.x=x;
SquareArray[i].pt.y=y;
x=x+12;
if(xbitmapWidth)
{x=0;y=y+12;}
//初始所有小块都未被击中过
SquareArray[i].HitFlag=FALSE;
}
long RandNum;//随即变量
srand( (unsigned)time( NULL ) );//生成随机种子
for(i=0;i=ArrayLength;i++)
{
do
{
RandNum=(long)( ( (double)ArrayLength )*rand()/RAND_MAX );//随机变量在0到ArrayLength-1之间取值
x=SquareArray[RandNum].pt.x;
y=SquareArray[RandNum].pt.y;
}while(SquareArray[RandNum].HitFlag==TRUE);//检查小块以前是否被击中过,如果是,重新计算一个随机数
SquareArray[RandNum].HitFlag=TRUE;//设置击中标志
::StretchDIBits(pDC-GetSafeHdc(),
x, y, 12,12,
x,bitmapHeight-y-12, 12,12,
m_pImgData, pBitmapInfo,DIB_RGB_COLORS, SRCCOPY);
Sleep(1);//设置延时时间
}
delete [] SquareArray;
}
VC++图像处理
学C++图像处理我推荐就用win32 API就好了,比mfc封装的类明了多了。
给你一段我刚写的截屏代码
HDC hDesktopDC=::GetDC(NULL);
BITMAPINFOHEADER BitmapInfo;
ZeroMemory(BitmapInfo,sizeof(BITMAPINFOHEADER));
BitmapInfo.biSize=sizeof(BITMAPINFOHEADER);
BitmapInfo.biBitCount=24;
BitmapInfo.biCompression=BI_RGB;
BitmapInfo.biPlanes=1;
BitmapInfo.biWidth=GetDeviceCaps(hDesktopDC,HORZRES);
BitmapInfo.biHeight=GetDeviceCaps(hDesktopDC,VERTRES);
BitmapInfo.biSizeImage=(BitmapInfo.biWidth*BitmapInfo.biBitCount+31)/32*4*BitmapInfo.biHeight;;
//内存DC,用于保存截屏后的图片
HDC hMemDC=CreateCompatibleDC(NULL);
BYTE *pDibBuffer;//内存DIB数据指针,,你可能会想这个指针干什么用的。可以对这个指针指向的图像数据进行图像处理,如变成灰度图片,那是你自己实现算法的事了
//创建画布,是一个内存DIB画布
HBITMAP hBitmap=CreateDIBSection(NULL,(BITMAPINFO*)BitmapInfo,DIB_RGB_COLORS,(void**)pDibBuffer,NULL,0);
SelectObject(hMemDC,hBitmap);
//将屏幕图像拷贝到内存DC
BitBlt(hMemDC,0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,hDesktopDC,0,0,SRCCOPY);
//保存pDibBuffer数据得到一张BMP图片
DeleteObject(hBitmap);
DeleteDC(hMemDC);
::ReleaseDC(NULL,hDesktopDC);
关于图像处理的一段vc代码,请教是什么意思阿?
GetDimensions()明显是获取图像的宽和高,结果存在一个CSize结构里,cx表示宽,cy表示高.
line=GetDimensions().cx;明显,这是一幅256色位图,每个像素正好占一个字节,因此图像的宽就是一行像素数据的字节数.
因为现在的计算机处理4字节宽的数据时速度最快,所以一行像素如果所占字节数不是4的倍数的话,会补上几个字节凑成4的倍数.line=(line/4+1)*4就起这个作用.
另外,DIB图像的像素数据是上下颠倒的,即第一行像素数据存的是图片实际显示时的最下面一行像素.所以要用y=GetDimensions().cy-y-1;
int index = *(m_lpImage+line*y+x);不用说了吧,上面做了这么多事,现在就是取(x,y)这点的像素值了.
vc图像处理代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于vc图像处理代码是什么、vc图像处理代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
相关推荐
- 05-18网站建设是干嘛的,网站建设是什么工作
- 05-18搜索引擎是什么意思,全文搜索引擎是什么意思
- 05-17抖音关键词优化,抖音关键词优化是什么意思
- 05-17网络营销师是做什么的,网络营销师培训费用是多少
- 05-17seo全称是什么意思,seo全拼
- 05-17做公司网页,做公司网页有什么简单的方法
- 05-17seo信息是什么,seo内容是什么意思
- 05-16设计师经常用的网站,设计师一般用什么网站
- 05-16seo网络推广技术,seo网络推广什么意思
- 05-16外包公司什么意思,外包公司什么意思缺点
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接