利用GDI+处理图像,包括图像的的裁剪显示、转置、镜像、简单旋转、变形等。
一、图像的裁剪显示:有时程序需要显示图像的一部分而不是全部。实例代码如下:
CDC* pDC = GetDC();
Graphics graph(pDC->GetSafeHdc());
Image image(_T("Pic.jpg"));
// 表示从原图的(20,20)处开始,裁剪宽高为300,400的矩形区域,将其显示在(10,10)处
graph.DrawImage(&image,,,,,,,UnitPixel);
ReleaseDC(pDC);
注意:对于不同的分辨率,这个函数可能对图像进行了缩放,可以通过以下函数进行输出尺寸的控制。
DrawImage(Image* image,const Rect& destRect,INT srcx,INT srcy,INT srcwidth,INT srcheight,Unit srcUnit...),其中destRect表示输出图像的矩形区域。
二、图像的转置:就是将图像的x坐标与y坐标交交换位置。转置于旋转是不同的。转置前的图无法通过旋转得到转置后的图。可以使用以下函数进行转置处理:
Status Graphics::DrawImage(Image* image,const Point* desPoints,INT count);
Status Graphics::DrawImage(Image* image,const PointF* desPoints,INT count);
其中,若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点坐标。
graph.DrawImage(&image, , ); // 输出原图像 // 输出图像的左上角坐标 int nX = ;
int nY = ; int nWidth = image.GetWidth();
int nHeight = image.GetHeight(); Point points[] = {
Point(nX,nY), // 源图像的左上角对应的目标图像的坐标
Point(nX,nY + nWidth), // 源图像的右上角对应的目标图像的坐标
Point(nX + nHeight,nY) // 源图像的左下角对应的目标图像的坐标
};
graph.DrawImage(&image, points, );
三、图像的镜像:分为水平与垂直镜像。水平镜像类似镜子,垂直镜像类似于水中的投影。
(1)水平镜像
graph.DrawImage(&image, , ); int nX = ;
int nY = ; int nWidth = image.GetWidth();
int nHeight = image.GetHeight(); Point points[] = {
Point(nX + nWidth,nY), // 源图像的左上角对应的目标图像的坐标
Point(nX,nY), // 源图像的右上角对应的目标图像的坐标
Point(nX + nWidth,nY +nHeight) // 源图像的左下角对应的目标图像的坐标
};
graph.DrawImage(&image, points, );
(2)垂直镜像
graph.DrawImage(&image, , ); int nX = ;
int nY = ; int nWidth = image.GetWidth();
int nHeight = image.GetHeight(); Point points[] = {
Point(nX ,nY + nHeight),
Point(nX+nWidth,nY +nHeight),
Point(nX,nY )
};
graph.DrawImage(&image, points, );
四、图像的简单旋转:
(1)图像旋转 90°
int nX = ;
int nY = ; Point points[] = {
Point(nX + nHeight,nY), // 源图像的左上角对应的目标图像的坐标
Point(nX+nHeight,nY+nWidth), // 源图像的右上角对应的目标图像的坐标
Point(nX,nY) // 源图像的左下角对应的目标图像的坐标
};
graph.DrawImage(&image, points, );
(2) 图像旋转180°
int nX = ;
int nY = ;
Point points[] = {
Point(nX + nWidth,nY + nHeight), // 源图像的左上角对应的目标图像的坐标
Point(nX,nY + nHeight), // 源图像的右上角对应的目标图像的坐标
Point(nX + nWidth,nY) // 源图像的左下角对应的目标图像的坐标
};
graph.DrawImage(&image, points, );
五、图像的变形:
int nX = ;
int nY = ;
Point points[] = {
Point(nX,nY), // 源图像的左上角对应的目标图像的坐标
Point(nX + nWidth,nY + ), // 源图像的右上角对应的目标图像的坐标
Point(nX + ,nY + nHeight) // 源图像的左下角对应的目标图像的坐标
};
graph.DrawImage(&image, points, );
利用GDI+处理图像,包括图像的的裁剪显示、转置、镜像、简单旋转、变形等。的更多相关文章
- Matlab利用subplot绘制多个图像
利用subplot绘制多个图像 subplot(m,n,p) subplot是将多个图画到一个平面上的函数,m是行,n是列,p是所要绘制图所在的位置 x = 0:0.1:100; sinY = sin ...
- 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行解说,主要通过MFC单文档视图实现显示BMP图片空间几何变换.包含图像平移.图形 ...
- opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)
ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ...
- Image Retargeting - 图像缩略图 图像重定向
Image Retargeting 图像缩略图.图像重定向 前言 这篇文章主要对比DL出现之前的几种上古算法,为了作为DL方法的引子而存在,顺便博客也该更新点新内容上来了,这篇博文就是介绍了我最近在玩 ...
- PHP图像裁剪为任意大小的图像,图像不变形,不留下空白
<?php /** * 说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形 * 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高 */ fu ...
- Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
Atitti 图像处理 图像混合 图像叠加 blend 原理与实现 混合模式 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 混合模式是图像处理技术中的一个技术名词,不 ...
- 学习笔记:利用GDI+生成简单的验证码图片
学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...
- C#利用GDI+绘制旋转文字等效果
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
随机推荐
- JDK 之资源文件管理
JDK 之资源文件管理 JDK 规范目录(https://www.cnblogs.com/binarylei/p/10200503.html) 一.文件资源 user.home 用户目录,如 Linu ...
- 我的MVP呢?
Ladies and gentelmen, welcome the MVP of NBA 16-2017 Season:... 呃,等下,好像哪里不对.那是因为,我要说的MVP根本就不是Most Va ...
- java连接数据库以及连接参数格式
//链接数据库代码部分 下面具有连接的基本参数可以对照修改(参数存放在file下面的database.properties下面) //参数存放在file下面的database.properties下 ...
- ros pluginlib 段错误
最近在重新回看ROS插件时,运行出现了段错误,发现是boost版本问题,我目前版本是1.66,应该调整至1.58版本,如果跟其他软件使用不同的boost版本时,可以把相应版本编译到本地,不instal ...
- Java设计模式(8)——策略模式
一.策略模式定义 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户 ...
- 【转】Linq表达式、Lambda表达式你更喜欢哪个?
[转]Linq表达式.Lambda表达式你更喜欢哪个? 什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相 ...
- NOIP水题测试(2017082401)
哈,水题测试又来了! 上次的水题简单吧! 答案是以单题形式发布的(旅行家的预算随后发布). 下面来看今天的题,还是水题. 时间限制:5小时 题目一:看上去就很水 题目二:比上面一题还水 题目三:数的划 ...
- python学习 day4 (3月5日)---列表
列表: 容器性数据 有序 可更改 大量数据 一.增 1.追加 append(objcet) 2.索引增加 Insert(index,元素) 3.迭代追加 extend(object) ...
- HTML 内 meta标签
<!-- 是否删除默认的苹果工具栏和菜单栏 --> <meta name="apple-mobile-web-app-capable" content=" ...
- FS210(cortex-A8)移植MT7601无线WIFI模块
准备:ubuntu 12.04 板子内核:3.0.2 交叉编译器:arm-cortex_a8-linux-gnueabi-gcc 所需资源下载:https://pan.baidu.com/s/1yWA ...