GDI+旋转图片的几种方法

原创 2014年11月10日 13:17:22
1. 使用旋转矩阵


POINT imgRotateCenterPos={10,10}; //旋转中心在图片坐标(相对于图片本身)
CRect rcShow(imgShowRect); //图片要绘制的位置区域.
//把 相对于图片的旋转中心坐标  转换为  绘制区域的坐标
PointF centerPos(imgRotateCenterPos.x+rcShow.left, imgRotateCenterPos.y+rcShow.top);

Matrix mtr;​
//先把源点移动到旋转中心点
mtr.Translate(centerPos.x, centerPos.y);
//旋转一度角度
mtr.Rotate(m_angle);
//还原源点
mtr.Translate(-centerPos.x, -centerPos.y);

//注: 前3个函数的调用, 等价于这一个函数 mtr.RotateAt(angle, centerPos);

//对gp设置变换矩阵
gp.SetTransform(&mtr);
//在某个起点显示图像
gp.DrawImage(pImg, rcShow.left,rcShow.top,rcShow.Width(), rcShow.Height());

2. 直接使用Graphic的方法

POINT imgRotateCenterPos={10,10}; //旋转中心在图片坐标(相对于图片本身)
CRect rcShow(imgShowRect); //图片要绘制的位置区域.
//把 相对于图片的旋转中心坐标  转换为  绘制区域的坐标
PointF centerPos(imgRotateCenterPos.x+rcShow.left, imgRotateCenterPos.y+rcShow.top);

gp.TranslateTransform(centerPos.x,centerPos.y); //源点移动到旋转中心
gp.RotateTransform(m_angle); //旋转
gp.TranslateTransform(-centerPos.x, -centerPos.y);//还原源点

//在某个起点显示图像
gp.DrawImage(pImg, rcShow.left,rcShow.top,rcShow.Width(), rcShow.Height());


3. 使用旋转点

POINT imgRotateCenterPos={10,10}; //旋转中心在图片坐标(相对于图片本身)
CRect rcShow(imgShowRect); //图片要绘制的位置区域.
//把 相对于图片的旋转中心坐标  转换为  绘制区域的坐标
PointF centerPos(imgRotateCenterPos.x+rcShow.left, imgRotateCenterPos.y+rcShow.top);

// 定义一个单位矩阵,坐标原点在表盘中央
  //Matrix matrixH(1,0,0,1,posX,posY);
Matrix matrixH;
  // 时针旋转的角度度,  这里跟前面一样
matrixH.Translate(centerPos.x, centerPos.y);
  matrixH.Rotate(m_angle);
  matrixH.Translate(-centerPos.x,-centerPos.y);

这里的三个点的解释: 这三个点决定了一个平行四边形区域, 这个区域是目标绘图区域.
第一个点是目标区域(left,top), 第二个点(right,top), 第三个点(left,bottom)
Point pointsH[] = { Point(rcShow.left, rcShow.top),Point(rcShow.right, rcShow.top),Point(rcShow.left, rcShow.bottom)};

  // 用该矩阵转换points
  matrixH.TransformPoints( pointsH, 3);
  gp.DrawImage (pImg, pointsH, 3);



如果要在同一个dc中显示多个不同旋转点的图, 需要使用ResetTransform恢复矩阵后, 再绘制其它

GDI+图像的显示、裁剪、缩放、转置、镜像、旋转、变形

GDI+的配置: http://blog.csdn.net/lys07962000/article/details/8948996    void CXXDlg::OnPaint() { ....
  • lys07962000
  • lys07962000
  • 2013年08月13日 20:09
  • 5462

C#中基于GDI+(Graphics)图像处理系列之任意角度旋转图像

简介 动手前先解决两个问题 1获取图片旋转后所占的矩形区域宽高 2已知一个矩形如何绘制其绕其中心点旋转N度后的矩形区域 获得图像旋转任意角度后的图像 完整示例程序源码下载简介图像旋转功能在实际使用中出...
  • lhtzbj12
  • lhtzbj12
  • 2017年01月05日 22:53
  • 5199

双缓冲gdi+旋转图像固定角度

HDC hdc= m_PaintManager.GetPaintDC(); HDC hMemDC = ::CreateCompatibleDC(hdc); HBITMAP hMemBitmap =...
  • u011061503
  • u011061503
  • 2014年07月18日 17:54
  • 1008

GDI+学习及代码总结之-----坐标变换、矩阵变换及色彩变换

坐标变换、矩阵变换 在Graphics类中,有几个函数实现了简单的坐标变换 Graphics::TranslateTransform(dx, dy, order)//平移坐标系 Graph...
  • harvic880925
  • harvic880925
  • 2013年06月18日 15:21
  • 7582

用GDI+使文字轻松旋转

用GDI+使文字轻松旋转 下载本文代码见资源 在老式的Windows图形设备接口中制作旋转文字会是一件痛苦费力的工作,但在.NET...
  • metababy
  • metababy
  • 2006年01月14日 18:27
  • 8768

图片任意角度旋转类(gdi+)

  • 2009年12月11日 11:33
  • 139KB
  • 下载

VC++实现图片的旋转

第一步,你必须知道位图即BMP格式的文件的结构. 位图(bmp)文件由以下几个部分组成: 1.BITMAPFILEHEADER,它的定义如下: typedef struct tag...
  • u010019717
  • u010019717
  • 2013年04月11日 16:32
  • 1446

一个使用GDI+进行图像旋转处理的例子

  • 2015年03月05日 15:23
  • 1.09MB
  • 下载

Image类--2--旋转和翻转图片

inline Status Image::RotateFlip( IN RotateFlipType rotateFlipType ) enum RotateFlipType { ...
  • hgy413
  • hgy413
  • 2011年08月09日 10:52
  • 3597

关于HDC CDC 兼容DC

HDC是句柄,CDC是MFC封装的windows设备相关的一个 类,clientDC是CDC的一个衍生类,产生于对应windows客户区的对象。 pDC是类指针,HDC是windows句柄,...
  • zhang11wu4
  • zhang11wu4
  • 2012年03月05日 17:06
  • 1312
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GDI+旋转图片的几种方法
举报原因:
原因补充:

(最多只允许输入30个字)