CImage通过WinApi的SetWorldTransform来实现图片旋转

SetWorldTransform的功能是旋转画布,这样产生的效果就是图像旋转。因此,在旋转画布之前,要把要旋转的图像的位置和大小准备好,这样旋转之后,才能使图像正好出现在显示区域内。这需要计算两个关键参数,图像的左上角坐标和旋转中心坐标。因为是固定大小旋转,因此我们将中心设定在图像的显示中心。这样需要计算选中图像的高和宽。
如下图:

具体实现方法如下:

void ImageRotation(CImage* dst, const CImage* src, double angle)
{// 计算弧度angle = angle * PI / 180;// 获取图像宽度和高度int width = src->GetWidth();int height = src->GetHeight();// 计算旋转后的图像大小,并调整目标图像尺寸int newWidth = static_cast<int>(abs(cos(angle)) * width + abs(sin(angle)) * height);int newHeight = static_cast<int>(abs(sin(angle)) * width + abs(cos(angle)) * height);if (!dst->IsNull()){dst->Destroy();}dst->Create(newWidth, newHeight, src->GetBPP());CPoint centerPt;CRect rect;rect.SetRect(0, 0, dst->GetWidth(), dst->GetHeight());centerPt.x = (rect.left + rect.right) / 2;centerPt.y = (rect.top + rect.bottom) / 2;// 获取源图像和目标图像的设备上下文对象CImageDC hdcSource(*src);CImageDC hdcDest(*dst);// 设置图形模式SetGraphicsMode(hdcDest, GM_ADVANCED);// 保存旋转数据的结构体XFORM xform;xform.eM11 = static_cast<FLOAT>(cos(angle));xform.eM12 = static_cast<FLOAT>(sin(angle));xform.eM21 = static_cast<FLOAT>(-sin(angle));xform.eM22 = static_cast<FLOAT>(cos(angle));xform.eDx = (float)(centerPt.x - cos(angle)*centerPt.x + sin(angle)*centerPt.y);xform.eDy = (float)(centerPt.y - cos(angle)*centerPt.y - sin(angle)*centerPt.x);int nx, ny;nx = newWidth / 2 - width / 2;ny = newHeight / 2 - height / 2;// 进行旋转操作SetWorldTransform(hdcDest, &xform);CDC* pSrcDC = CDC::FromHandle(hdcSource);CDC* pDstDC = CDC::FromHandle(hdcDest);pDstDC->StretchBlt(nx, ny, src->GetWidth(), src->GetHeight(), pSrcDC, 0, 0, src->GetWidth(), src->GetHeight(), SRCCOPY);
}

该方法优点是速度快,比我之前写的双循环遍历像素点,对图片进行旋转要快得多。

我用来测试的jpg图片的分辨率是3456*4806,之前的遍历像素点方法用时是1700多毫秒,而上面的方法用时是600多毫秒,可见效果很明显了。

PS:我一开始用SetWorldTransform,旋转后,图像无法定位到正确的地方,还好借鉴了一个大佬的文章,连接在下方。

图片浏览器开发日志-05(显示速度)_setworldtransform 后显示慢-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/197329.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin学习——hello kotlin 函数function 变量 类 + 泛型 + 继承

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

如何进行手动脱壳

脱壳的目的就是找到被隐藏起来的OEP&#xff08;入口点&#xff09; 这里我一共总结了三种方法&#xff0c;都是些自己的理解希望对你们有用 单步跟踪法 一个程序加了壳后&#xff0c;我们需要找到真正的OEP入口点&#xff0c;先运行&#xff0c;找到假的OEP入口点后&#x…

SpringBoot 整合 JdbcTemplate(配置多数据源)

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

家电电器展示预约小程序的作用是什么

电器产品已经成为人们生活的必备品&#xff0c;如冰箱、电视机、洗衣机等&#xff0c;而这些产品的购买方式也很多&#xff0c;可以到线下门店购买&#xff0c;也可以到线上多个电商平台购买&#xff0c;如今互联网高速发展以及民众享受线上服务带来的便捷性&#xff0c;同时商…

windows环境搭建Zblog博客并发布上线公网可访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

MySql操作

Mysql数据库项目学习笔记 1.条件查询后排序 (SELECT counter : 0) temp设定临时变量ORDER BY id ASC用于将id以升序形式进行排列 SELECTcounter : counter 1 AS ROW,username,type,content FROMtest_info,( SELECTcounter : 0 ) temp WHEREusername 2 AND type 3 ORDER BYi…

网络文件共享服务(ftp和nfs)和如果用局域网搭建yum仓库

存储类型 存储类型分三种 1.直连式存储&#xff1a;DAS 2.存储区域网络&#xff1a;SAN 3.网络附加存储&#xff1a;NAS FTP文件传输协议 软件要利用协议&#xff0c;协议时通过应用程序实现的 各协议端口 ftp &#xff1a;20&#xff08;数据&#xff09; 21&#xff0…

好的CRM系统有哪些核心能力?

CRM是企业管理的重要工具&#xff0c;可以维护管理客户关系&#xff0c;提高企业的核心竞争力。市场营销、销售、客户服务和技术支持等相关领域都需要用到CRM系统。那么一个好的CRM&#xff0c;最核心的能力有哪些&#xff1f; 1.销售自动化 这里简单介绍下销售自动化的功能&…

值得学习的演示文稿制作范例

1,在第一张幻灯片前插入1张新幻灯片,设置幻灯片大小为“全屏显示(16:9) ”;为整个演示文稿应用“离子会议室”主题,放映方式为“观众自行浏览”;除了标1题幻灯片外其它每张幻灯片中的页脚插入“晶泰来水晶吊坠”七个字。 2,第一张幻灯片的版式设置为“标题幻灯片”,主标题为“…

MPN在QM中的使用

此文章为机器翻译SAP BLOG 文章&#xff0c;原文地址&#xff1a;Manufacturer Part Profile in QM | SAP Blogs 目的&#xff1a;–材料管理 (MM) 组件支持从不同供应商采购制造商特定的零件或材料。如果您实施制造商零件编号 (MPN) 处理功能&#xff0c;您还可以在质量管理 …

采集淘宝天猫整店商品api(店铺列表、店铺所有商品)

返回数据&#xff1a;请求链接 {"items": {"shop_id": "336945718","page": "1","real_total_results": "75","total_results": "75","page_size": 10,"page_coun…