当前位置:首页 > 代码 > 正文

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站长 原创,转载请注明出处和附带本文链接;

本文地址:http://www.ahzz.com.cn/post/1087.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载