GDI图像基本操作
来源:互联网 发布:机构调研数据 编辑:程序博客网 时间:2024/06/06 14:25
GDI图像基本操作:
借鉴自:http://blog.csdn.net/harvic880925/article/details/9129011
实例:
void CMFC_GDI_TESTDlg::OnLoadImg(){// 基本变换CDC* cdc = GetWindowDC();Gdiplus::Graphics graphics(cdc->GetSafeHdc());graphics.Clear(Color(255,255,255,255)); Gdiplus::Image image(L"1.png");UINT width=image.GetWidth(); UINT height=image.GetHeight(); //原图显示graphics.TranslateTransform(0, 60); //平移来改变图像平面坐标,使其从此坐标重新开始绘图graphics.DrawImage(&image, RectF(0, 0, width, height));//显示image,使用RectF进行缩放//缩小一半显示graphics.TranslateTransform(width+20, 0); //平移来改变图像平面坐标,使其从此坐标重新开始绘图graphics.DrawImage(&image,RectF(0, 0,width/2, height/2)); //放大一倍显示graphics.TranslateTransform(width/2+20, 0); graphics.DrawImage(&image,RectF(0, 0,2*width, 2*height),0,0,width,height,UnitPixel); //40,10为图像截取的宽和高,//在坐标系平移后的坐标点上,绘制大小宽为2*width,长为2*height,显示的内容是在原图width+40,height+10的基础上截取后平铺显示//使用插补模式控制图形缩放质量//高质量双三次插值法 这种方法是内存消耗最大graphics.TranslateTransform(2*width+20, 0); graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);//高质量双三次插值法 graphics.DrawImage(&image,RectF(0,0,2*width,2*height),20,20,width/2,height/2,UnitPixel); //最临近插值法 只有这种方法会产生马赛克效果,但是资源使用最小graphics.TranslateTransform(2*width+20, 0); graphics.SetInterpolationMode(InterpolationModeNearestNeighbor);//最临近插值法 graphics.DrawImage(&image,RectF(0,0,2*width,2*height),20,20,width/2,height/2,UnitPixel); //旋转 Matrix matrix; //矩阵变换graphics.GetTransform(&matrix); graphics.SetTransform(&matrix); graphics.ResetTransform();//重置坐标时序,从左上角原点开始//原图 graphics.TranslateTransform(0, 2*width+60+20); graphics.DrawImage(&image,RectF(0, 0, width, height));//不旋转 水平翻转 graphics.TranslateTransform(width+20, 0); image.RotateFlip(RotateNoneFlipX); //不旋转 水平翻转 graphics.DrawImage(&image,RectF(0, 0, width, height));//旋转90度 不翻转 graphics.TranslateTransform(width+20, 0); image.RotateFlip(Rotate90FlipNone); //旋转90度不翻转 graphics.DrawImage(&image,RectF(0, 0, width, height));//旋转90度 水平翻转 graphics.TranslateTransform(width+20, 0); image.RotateFlip(Rotate90FlipX); //旋转90度水平翻转graphics.DrawImage(&image,RectF(0, 0, width, height));//缩略图graphics.ResetTransform();//重置坐标时序,从左上角原点开始image.RotateFlip(Rotate180FlipNone); //先把原图还原,不然会使用上面变换过的图片填充,由于上面翻转过,所以使用反向翻转还原graphics.TranslateTransform(0, 2*width+60 +20 +width+20); float shear=image.GetHeight()/image.GetWidth();//获取高/宽比,以至缩放时不变形 Image *pThumbnail=image.GetThumbnailImage(0.5*width,height,NULL,NULL);//使用0.5倍宽度*高度的原图来填充下面的椭圆TextureBrush picBrush(pThumbnail); graphics.FillEllipse(&picBrush,RectF(0,0,400,200)); //克隆图片 是GDI+ 特有的概念 Bitmap类可以实现局部克隆和整体克隆,而Image类只能整体克隆//在这儿通过克隆 拆分图片成4部分graphics.ResetTransform();//重置坐标时序,从左上角原点开始graphics.TranslateTransform(420, 2*width+60 +20 +width+20); Bitmap bmp(L"1.png"); INT bmpheight=bmp.GetHeight(); INT bmpwidth=bmp.GetWidth(); RectF dest[4]; dest[0]=RectF(0, 0,bmpwidth/2, bmpheight/2); dest[1]=RectF(bmpwidth/2, 0,bmpwidth/2, bmpheight/2); dest[2]=RectF(0, bmpheight/2,bmpwidth/2, bmpheight/2); dest[3]=RectF(bmpwidth/2, bmpheight/2,bmpwidth/2, bmpheight/2); Bitmap *s[4]; s[0]=bmp.Clone(dest[0],PixelFormatDontCare);//拷贝bmp图片的局部s[1]=bmp.Clone(dest[1],PixelFormatDontCare); s[2]=bmp.Clone(dest[2],PixelFormatDontCare); s[3]=bmp.Clone(dest[3],PixelFormatDontCare); //绘图 graphics.DrawImage(s[0],dest[0]); graphics.DrawImage(s[1],RectF(bmpwidth/2+10,0,bmpwidth/2,bmpheight/2)); graphics.DrawImage(s[2],RectF(0,bmpheight/2+10,bmpwidth/2,bmpheight/2)); graphics.DrawImage(s[3],RectF(bmpwidth/2+10,height/2+10,bmpwidth/2,bmpheight/2)); ReleaseDC(cdc);}void CMFC_GDI_TESTDlg::OnZoomImg(){// 投射与倾斜CDC* cdc = GetWindowDC();Gdiplus::Graphics graphics(cdc->GetSafeHdc());//投射与倾斜graphics.Clear(Color::Green); //使用绿色来刷新背景graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); Image img(L"1.png"); INT left=100; INT top=200; INT width=img.GetWidth(); INT height=img.GetHeight(); for (int x=1; x<20; x++){graphics.Clear(Color::Green); //移动一次,刷新一次背景,使用绿色来刷新背景graphics.TranslateTransform(x, 1); //不断变换坐标 使其呈现位移的效果//正面 PointF desFace[]={ PointF(left,top), PointF(left+width,top), PointF(left,top+width), }; graphics.DrawImage(&img,desFace,3); //上面投射 PointF destTop[]={ //投射的图像矩形的三个坐标点需要我们自己计算给出PointF(left+width/4, top-width/4), PointF(left+width/4+width,top-width/4), PointF(left,top)}; graphics.DrawImage(&img,destTop,3); //侧面投射 PointF desRight[]={ PointF(left+width,top), PointF(left+width/4+width,top-width/4), PointF(left+width,top+width) }; graphics.DrawImage(&img,desRight,3); Sleep(300);}ReleaseDC(cdc);}void CMFC_GDI_TESTDlg::OnReduceImg(){// 色彩变换CDC* cdc = GetWindowDC();Gdiplus::Graphics graphics(cdc->GetSafeHdc());graphics.TranslateTransform(0, 60); //平移来改变图像平面坐标,使其从此坐标重新开始绘图graphics.Clear(Color(255,255,255,255)); Image img(L"1.png"); int width=img.GetWidth();int height=img.GetHeight();//原图graphics.DrawImage(&img,RectF(0,0,width,height));//应用色彩变换graphics.TranslateTransform(width+10,0);ColorMatrix colorMatrix={//色彩矩阵0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,1.0f};ImageAttributes imgattr;//使用上面色彩矩阵绘图imgattr.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);graphics.DrawImage(&img,RectF(0,0,img.GetWidth(),img.GetHeight()),0,0,img.GetWidth(),img.GetHeight(),UnitPixel,&imgattr);//临时清除对图像色彩的变换imgattr.SetNoOp(ColorAdjustTypeBitmap);graphics.TranslateTransform(width+10,0);graphics.DrawImage(&img,RectF(0,0,img.GetWidth(),img.GetHeight()),0,0,img.GetWidth(),img.GetHeight(),UnitPixel,&imgattr);//撤销的上面的清除操作imgattr.ClearNoOp(ColorAdjustTypeBitmap);graphics.TranslateTransform(width+10,0);graphics.DrawImage(&img,RectF(0,0,img.GetWidth(),img.GetHeight()),0,0,img.GetWidth(),img.GetHeight(),UnitPixel,&imgattr);ReleaseDC(cdc);}void CMFC_GDI_TESTDlg::OnSpinImg(){// 设置透明色范围,可用于范围抠图CDC* cdc = GetWindowDC();Gdiplus::Graphics graphics(cdc->GetSafeHdc());graphics.TranslateTransform(0, 60); //平移来改变图像平面坐标,使其从此坐标重新开始绘图graphics.Clear(Color(255,0,255,0)); Image img(L"2.png");//绘制原图graphics.DrawImage(&img,RectF(0,0,img.GetWidth(),img.GetHeight()));//设置透明色范围graphics.TranslateTransform(img.GetWidth()+10,0);ImageAttributes imgAttributes;imgAttributes.SetColorKey(Color(0,100,200,200),Color(0,255,255,255),ColorAdjustTypeBitmap);graphics.DrawImage(&img,RectF(0,0,img.GetWidth(),img.GetHeight()),0,0,img.GetWidth(),img.GetHeight(),UnitPixel,&imgAttributes);ReleaseDC(cdc);}
实际效果:
1 0
- GDI图像基本操作
- GDI+之图像操作
- GDI+图像操作
- opencv基本图像操作
- 图像的基本操作
- python基本图像操作
- opencv图像基本操作
- 【pytorch】图像基本操作
- 基本图像操作
- 【基本图像操作】PIL
- 【基本图像操作】Matplotlib
- 【基本图像操作】NumPy
- opencv-图像基本操作
- skimage-图像基本操作
- OpenCV-图像基本操作
- GDI+ 画刷、矩阵、基本绘图函数、文字、图像
- GDI+学习及代码总结之------图像的基本处理
- GDI+学习及代码总结之------图像的基本处理
- Ubuntu 16.04 安装网易云音乐
- anroid studio installation failed with message install_canceled_by_user
- dpkg apt
- 网页使用百度地图后,显示不全(已解决)
- I/O复用,select和Reactor模式
- GDI图像基本操作
- 编译器错误消息: CS0016: 未能写入输出文件,在编译向该请求提供服务所需资源的过程中出现错误
- C++ int转string
- ssh中的分页查询商品
- Retrofit用法详解
- 细说Reactor模式
- C#连接服务器共享文件夹
- OpenCV中的Haar+Adaboost(七):分类器训练过程
- java 设置main函数执行的参数