VC++图像处理程序实验Word文档格式.docx
- 文档编号:8284635
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:48
- 大小:1.87MB
VC++图像处理程序实验Word文档格式.docx
《VC++图像处理程序实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《VC++图像处理程序实验Word文档格式.docx(48页珍藏版)》请在冰点文库上搜索。
要求:
显示一幅位图,实现图像颜色修改处理。
(1)在左视图中打开一幅bmp位图,包括256色或真彩色位图
(2)制作一个【图像颜色修改处理】菜单,将消息映射到右视图中,在右视图
中显示位图,完成图像颜色修改处理显示功能。
2.将图像中的红气球物体左右、上下、对称复制。
在左视图中打开一幅256色的灰度bmp位图。
将图像中的红气球物体左右、上下、对称复制。
(1)在左视图中打开一幅bmp位图,包括256色或真彩色位图
(2)制作一个【红气球复制】菜单,将消息映射到右视图中,在右视图
中,完成将图像中的红气球物体左右、上下、对称复制功能。
3.实现图像渐隐显示。
显示一幅位图,实现图像渐隐显示。
(2)制作一个【图像渐隐显示】菜单,将消息映射到右视图中,在右视图
中显示位图,完成图像图像渐隐显示功能。
4.自行设计图像的几何变换。
(选作)
要求:
自行设计图像的几何变换。
(2)制作一个【自行设计图像的几何变换】菜单,将消息映射到右视图中,在右视图中自行设计图像的特效显示,完成图像的几何变换功能。
◆实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论)
.图像颜色修改处理
编程思路:
该程序只针对24位彩色位图,不适用于灰度位图。
当原图的像素点为蓝色时,将显示屏幕上该位置的像素点像素值置为绿色,否则不变,将原图像素值赋给新图。
程序代码:
voidCDynSplitView2:
:
OnYansexiugai()
{
//刷新屏幕
CDC*pDC=GetDC();
CRectrect(0,0,1000,1000);
CBrushbrush(RGB(255,255,255));
pDC->
FillRect(&
rect,&
brush);
//复制图像数据
clearmem();
CDSplitDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc->
statedoc&
&
state2==1)
{
BYTE*pBitmapData=CDibNew1->
GetData();
LPBITMAPINFOpBitmapInfo=CDibNew1->
GetInfo();
intbitmapHeight=CDibNew1->
GetHeight();
intbitmapWidth=CDibNew1->
GetWidth();
LPBYTEtemp;
temp=newBYTE[CDibNew1->
GetHeight()*CDibNew1->
GetWidth()*3];
memset(temp,0,CDibNew1->
GetWidth()*3);
for(intj=0;
j<
bitmapHeight;
j++)
{
for(inti=0;
i<
bitmapWidth;
i++)
{
if(pBitmapData[j*bitmapWidth*3+i*3]==255&
pBitmapData[j*bitmapWidth*3+i*3+1]==0
&
pBitmapData[j*bitmapWidth*3+i*3+2]==0)
temp[j*bitmapWidth*3+i*3]=0;
temp[j*bitmapWidth*3+i*3+1]=255;
temp[j*bitmapWidth*3+i*3+2]=0;
}
else
temp[j*bitmapWidth*3+i*3]=pBitmapData[j*bitmapWidth*3+i*3];
temp[j*bitmapWidth*3+i*3+1]=pBitmapData[j*bitmapWidth*3+i*3+1];
temp[j*bitmapWidth*3+i*3+2]=pBitmapData[j*bitmapWidth*3+i*3+2];
}
:
StretchDIBits(pDC->
GetSafeHdc(),
0,0,bitmapWidth,bitmapHeight,
temp,pBitmapInfo,
DIB_RGB_COLORS,SRCCOPY);
memcpy(pBitmapData,temp,CDibNew1->
deletetemp;
}
}
实验效果
代码设计思路:
将气球画在图的上部四分一处,但图的大小为1,显示时将图像的上部四分一处复制四次,分别显示在左图。
程序核心代码:
OnHongqiqiufuzhi()
//TODO:
Addyourcommandhandlercodehere
inti,j;
LPBYTEtemp;
temp=newBYTE[CDibNew1->
memset(temp,0,CDibNew1->
for(j=0;
for(i=0;
temp[j*bitmapWidth*3+i*3]=pBitmapData[j*bitmapWidth*3+i*3];
temp[j*bitmapWidth*3+i*3+1]=pBitmapData[j*bitmapWidth*3+i*3+1];
temp[j*bitmapWidth*3+i*3+2]=pBitmapData[j*bitmapWidth*3+i*3+2];
:
0,bitmapHeight/2,bitmapWidth/2,bitmapHeight/2,
bitmapWidth/2,0,bitmapWidth/2,bitmapHeight/2,
0,0,bitmapWidth/2,bitmapHeight/2,
bitmapWidth/2,bitmapHeight/2,bitmapWidth/2,bitmapHeight/2,
}
}
3.图像渐隐显示
先记录下图想的每个像素点的像素值,显示的时候先将屏幕显示原图,将循环显示n次,这里设n从256,255,…,2,1,0。
每一次显示像素值的n/256倍,图像的像素点计算一遍后,显示一次,重复执行上述过程,直至屏幕上所有的像素点全变黑。
程序代码:
OnTuxiangjianyin()
if(CDibNew1->
GetRGB())//Hasacolortable
{
CPalette*hPalette=CreateBitmapPalette(CDibNew1);
CPalette*hOldPalette=pDC->
SelectPalette(hPalette,true);
pDC->
RealizePalette();
LPBYTEtemp,temp1,temp2;
GetWidth()];
memset(temp,0,CDibNew1->
GetWidth());
for(intn=256;
n>
=0;
n--)
temp1=pBitmapData;
temp2=temp;
for(intj=0;
for(inti=0;
{
*temp2=(*temp1)*(n)/256;
temp1++;
temp2++;
}
GetSafeHdc(),0,0,bitmapWidth,bitmapHeight,
temp,pBitmapInfo,
Sleep(10);
SelectPalette(hOldPalette,true);
DeleteObject(hPalette);
}
else
for(intm=256;
m>
m--)
temp[j*bitmapWidth*3+i*3]=pBitmapData[j*bitmapWidth*3+i*3]*(m)/256;
temp[j*bitmapWidth*3+i*3+1]=pBitmapData[j*bitmapWidth*3+i*3+1]*(m)/256;
temp[j*bitmapWidth*3+i*3+2]=pBitmapData[j*bitmapWidth*3+i*3+2]*(m)/256;
}
4.自行设计图像的几何变换
放大后做水平、垂直镜像
取得原图的数据区指针;
通过对话框获得放大整数比例:
X,Y,更改图像的宽度和高度;
每个像素依稀次循环,计算该像素在原图像中的坐标,将原图的像素值赋给目标像素相应X*Y个值。
放大过程完成。
开辟一个同样大小的缓冲区;
每个像素依次循环,在水平镜像中,将原图中的像素点的水平坐标变成镜像后的坐标(用图像的宽度减去坐标值)在显示到图像上。
垂直景镜像中,则对垂直坐标做相应的处理。
(1)放大后做镜像程序代码:
OnFangdashuipingjingxiang()
floatxzoom,yzoom;
CDlgSuoFangdlg;
//定义对话框
dlg.m_XZoom=2.0;
dlg.m_YZoom=2.0;
//显示对话框,提示用户设定窗口上下限
if(dlg.DoModal()!
=IDOK)
return;
//返回
xzoom=dlg.m_XZoom;
yzoom=dlg.m_YZoom;
deletedlg;
//删除对话框
//源图像的宽度和高度
LONGwide;
LONGheight;
//缩放后图像的宽度和高度
LONGnewwide;
LONGnewheight;
LONGnewLineBytes;
LPBYTEtemp;
//获取图像的宽度和高度
wide=CDibNew1->
height=CDibNew1->
if(CDibNew1->
m_pBitmapInfoHeader->
biBitCount<
9)
//计算缩放后的图像宽度和高度
newwide=(LONG)(wide*xzoom+0.5);
newheight=(LONG)(height*yzoom+0.5);
newLineBytes=(newwide*8+31)/32*4;
//分配内存,以保存新DIB
temp=newBYTE[newLineBytes*newheight];
memset(temp,0,newLineBytes*newheight);
CDibNew1->
m_pData=CDibNew1->
FangDa(temp,xzoom,yzoom,wide,height,newLineBytes,newheight);
SetWidth(newwide);
SetHeight(newheight);
JingXiang(TRUE);
//调用水平镜像处理函数
Invalidate();
//调用刷新函数
else
newwide=(LONG)(wide*xzoom*3);
newheight=(LONG)(height*yzoom);
temp=newBYTE[newwide*newheight];
memset(temp,0,newwide*newheight);
FangDa(temp,xzoom,yzoom,wide,height,newwide,newheight);
SetWidth(newwide/3);
放大代码:
LPBYTETeXiaoXianShiDib:
FangDa(LPBYTEtemp,floatxzoom,floatyzoom,LONGwide,LONGheight,LONGnewwide,LONGnewheight)
//指向源图像的指针
LPBYTEp_data;
LPBYTEtemp1;
//指向源象素的指针
LPBYTElpSrc;
//指向缩放图像对应象素的指针
LPBYTElpDst;
inti;
intj;
//象素在源DIB中的坐标
inti0;
intj0;
p_data=this->
//获取图像的宽度
intk1=(int)yzoom;
intk2=(int)xzoom;
if(m_pBitmapInfoHeader->
9)//灰度图像
temp1=newBYTE[newwide*newheight];
memset(temp1,(BYTE)255,newwide*newheight);
//针对图像每行进行操作
for(j=0;
newheight;
//针对图像每列进行操作
for(i=0;
newwide;
i++)
lpDst=(LPBYTE)temp1+newwide*j+i;
i0=(int)(i/xzoom+0.5);
j0=(int)(j/yzoom+0.5);
if((i0>
=0)&
(i0<
wide)&
(j0>
(j0<
height))
lpSrc=(LPBYTE)p_data+wide*j0+i0;
*lpDst=*lpSrc;
temp=temp1;
returntemp;
else//24位彩色
temp1=newBYTE[newwide*newheight*4];
memset(temp1,255,newwide*newheight*4);
intr,g,b;
height;
wide;
lpSrc=(LPBYTE)p_data+wide*j*3+i*3;
r=*lpSrc+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 图像 处理 程序 实验