利用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+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
随机推荐
- Getting svn to ignore files and directories
August 27, 2013Software Developmentresources, subversion, svn, tutorial, version control Who knew it ...
- urllib和requests库
目录 1. Python3 使用urllib库请求网络 1.1 基于urllib库的GET请求 1.2 使用User-Agent伪装后请求网站 1.3 基于urllib库的POST请求,并用Cooki ...
- apicloud模块开发知识点
1. 没有加模块的时候dex里面的包 \android\support\annotation \android\support\v4 \com\uzmap\pkg \compile 2. 不能混淆的类 ...
- java 开发微信中回调验证一直提示 解密失败处理(Java)
微信公众号平台接入JDK6和JDK7及JDK8加解密失败处理(Java) 根据自己jdk版本编译,如jdk7或者jdk6 ,此时部署后提示报错:java.security.InvalidKeyExce ...
- ros pluginlib 段错误
最近在重新回看ROS插件时,运行出现了段错误,发现是boost版本问题,我目前版本是1.66,应该调整至1.58版本,如果跟其他软件使用不同的boost版本时,可以把相应版本编译到本地,不instal ...
- Angular学习笔记:Angular CLI
定义 Angular CLI:The Angular CLI is a command line interface tool that can create a project, add files ...
- web API分类
什么是Web API? Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务.消息服务.计算服务等能力,利用这些能力可以进行开发出强大功能的web应用. 分类 ...
- Python之字符串基本操作
#!/usr/bin/env python#-*-coding utf8-*-#Author:caojininfo = { 'stu1001': 'caojin', 'stu1002': 'zhaom ...
- 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...
- js setInterval详解
[自己总结]: 语法 setInterval(code,interval) ①可以有第三个参数,第三个参数作为第一个参数(函数)的参数 ②第一个参数是函数,有三种形式: 1.传函数名,不用加引号,也 ...