在上一篇中,我们了解了gg库的基本使用,包括调整大小、调整圆形参数、设置颜色、保存图片、加载图片和裁剪。这一篇我们来学习一下图片的旋转。

加载图片

首先,我们先来一张黄图。

func TestRotateImage(t *testing.T) {
width := 1000
height := 1000 dc := gg.NewContext(width, height)
dc.DrawRectangle(0, 0, float64(width), float64(width))
dc.SetRGB255(255, 255, 0)
dc.Fill()
dc.SavePNG("test.png")
}

然后加载好我们要旋转的图片,用的仍旧是我们上一篇中使用的图。

func TestRotateImage(t *testing.T) {
im, err := gg.LoadImage("/Users/bytedance/Desktop/test.png")
if err != nil {
panic(err)
}
w := im.Bounds().Size().X
h := im.Bounds().Size().Y width := 2 * w
height := 2 * h dc := gg.NewContext(width, height)
dc.DrawRectangle(0, 0, float64(width), float64(width))
dc.SetRGB255(255, 255, 0)
dc.Fill() dc.DrawImage(im, width/4, height/4)
dc.SavePNG("test.png")
}

这里为了更好的看到旋转的效果,对之前的代码做了一些调整。把画布大小设置为2倍图片的长宽。

width := 2 * w
height := 2 * h dc := gg.NewContext(width, height)

然后绘制了一个矩形,并且将它的颜色填充为黄色(因为图片比较白,用黑色背景更容易看到边界)。

dc.DrawRectangle(0, 0, float64(2*h), float64(2*w))
dc.SetRGB255(255, 255, 0)
dc.Fill()

顺便纠正一下上一篇中的遗漏的点,使用 setRGB() 方法来设置颜色确实需要使用转换函数来将RGB值进行映射,但还有另一个方法 SetRGB255() 可以直接设置RGB值,就不需要先进行一次转换了。

然后我们将图片加载到了正中心的位置,(w/4,h/4) 对应图片左上角在画布上的位置。

dc.DrawImage(im, width/4, height/4)

输出的图片如下:

旋转图片

图片加载好了,下面我们开始添加一个旋转操作。

func TestRotateImage(t *testing.T) {
im, err := gg.LoadImage("/Users/bytedance/Desktop/test.png")
if err != nil {
panic(err)
}
w := im.Bounds().Size().X
h := im.Bounds().Size().Y width := 2 * w
height := 2 * h dc := gg.NewContext(width, height)
dc.DrawRectangle(0, 0, float64(width), float64(width))
dc.SetRGB255(255, 255, 0)
dc.Fill() dc.Rotate(45)
dc.DrawImage(im, width/4, height/4)
dc.SavePNG("test.png")
}

其实只添加了一行代码,就是在加载图片前先调用了 Rotate() 方法。想象之中,我们会把图片旋转45度,但实际上是这样的:

好像不太符合预期,实际上,仔细研究一下就会发现,这里的旋转是围绕原点也就是整个画布的左上角进行旋转的,那我想要它围绕中心点旋转该怎么办呢?别慌,换一个方法就可以了。RotateAbout() 方法可以指定图片的旋转中心点,换这个来试试看:

func TestRotateImage(t *testing.T) {
im, err := gg.LoadImage("/Users/bytedance/Desktop/test.png")
if err != nil {
panic(err)
}
w := im.Bounds().Size().X
h := im.Bounds().Size().Y width := 2 * w
height := 2 * h dc := gg.NewContext(width, height)
dc.DrawRectangle(0, 0, float64(width), float64(width))
dc.SetRGB255(255, 255, 0)
dc.Fill() dc.RotateAbout(45, float64(width/2), float64(height/2))
dc.DrawImage(im, width/4, height/4)
dc.SavePNG("test.png")
}

这下图片确实绕中心点旋转了,但转45度好像不应该是这样的,再来看看这个方法的说明:

// RotateAbout updates the current matrix with a clockwise rotation.
// Rotation occurs about the specified point. Angle is specified in radians.

可以看到,第一个参数的意思其实代表的是弧度,而不是角度,所以想要旋转45度当然不能这么传,我们换一个姿势再试试。

func TestRotateImage(t *testing.T) {
im, err := gg.LoadImage("/Users/bytedance/Desktop/test.png")
if err != nil {
panic(err)
}
w := im.Bounds().Size().X
h := im.Bounds().Size().Y width := 2 * w
height := 2 * h dc := gg.NewContext(width, height)
dc.DrawRectangle(0, 0, float64(width), float64(width))
dc.SetRGB255(255, 255, 0)
dc.Fill() dc.RotateAbout(gg.Radians(45), float64(width/2), float64(height/2))
dc.DrawImage(im, width/4, height/4)
dc.SavePNG("test.png")
}

这下终于得到了我们想要的图。

总结

图片旋转其实很简单,只需要在绘制前调用 Rotate()RotateAbout() 方法即可。但需要注意几点:

  1. 旋转是顺时针旋转
  2. Rotate 方法是绕左上角旋转
  3. 第一个参数都代表的是弧度而不是角度

这样旋转我们也能掌握了,图片处理功能又进了一步。喜欢本文的朋友欢迎点赞收藏加关注~

【Go语言绘图】图片的旋转的更多相关文章

  1. 【Go语言绘图】gg 库的基本使用

    最近接了个比较大的需求,需要做很多图片处理的事情,比如图片的旋转裁截拼接,各种渐变处理,文字排列,一开始光是想想就头疼.但没有办法,既然已经需求已经到手上了,那就得把它做好才行,于是便开始被迫营业,无 ...

  2. css3相册图片3D旋转展示特效

    查看效果:http://hovertree.com/texiao/css/14/ 本效果用css3的animation实现动画 定义和用法animation 属性是一个简写属性,用于设置六个动画属性: ...

  3. 网页特效:用CSS3制作3D图片立方体旋转特效

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. windows phone 摄像头得到图片是旋转90°

    我上个随笔讲到,windows phone 拍出来的photo如果直接使用是反转了90°的. 研究了很久..终于发现问题.其实..这是使用习惯问题... CameraCaptureUI 得到的phot ...

  5. js图片左右旋转

    图片显示 <p> <a href="images/example2.jpg" rel="lightbox-group" title=" ...

  6. 制作3D图片立方体旋转特效

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>CS ...

  7. 类似百度音乐唱片播放时CD图片不停旋转的实现

    类似百度音乐唱片播放时CD图片不停旋转的实现 效果图 1 html代码 2 <imgsrc="img/logo.png"class="img-responsive& ...

  8. iOS 图片裁剪 + 旋转

    iOS 图片裁剪 + 旋转 之前分别介绍了图片裁剪和图片旋转方法 <iOS 图片裁剪方法> 地址:http://www.cnblogs.com/silence-cnblogs/p/6490 ...

  9. 运用C语言将图片转换成16进制的字符串(base64)

    最近在写手机端的性能测试脚本的时候,发现手机在上传图片数据时,先将图片转换成一堆16进制的字符,将字符传输过去,服务器再将字符解码成图片 我们在loadrunner中测试时,就需要用C语言将图片编码. ...

随机推荐

  1. php include文件包含

    XCTF题目:Web_php_include <?php show_source(__FILE__);//高亮显示源文件 echo $_GET['hello']; $page=$_GET['pa ...

  2. 面试必看!靠着这份字节和腾讯的面经,我成功拿下了offer!

    准备 敲定了方向和目标后就开始系统准备,主要分为以下几个方面来准备. 算法题 事先已经看过别人的社招面经知道头条每轮技术面都有算法题,而这一块平时练习的比较少,校招时刷的题也忘记了很多.因此系统复习的 ...

  3. 微课制作软件Camtasia,来为视频添加预设动画效果

    之前已介绍过使用微课制作软件Camtasia为视频添加"缩放和平移"动画的教程以及"效果按钮"的使用. 此篇内容,我们就来介绍使用录像编辑软件--Camtasi ...

  4. 《SpringBoot第一篇:HelloWorld启蒙》

    每篇一律 云对雨,雪对风,晚照对晴空. 来鸿对去雁,宿鸟对鸣虫. --<声律启蒙·一东> 什么是Spring Boot SpringBoot 是为了简化 Spring 应用的创建.运行.调 ...

  5. DC靶机1-9合集

    DC1 文章前提概述 本文介绍DC-1靶机的渗透测试流程 涉及知识点(比较基础): nmap扫描网段端口服务 msf的漏洞搜索 drupal7的命令执行利用 netcat反向shell mysql的基 ...

  6. 从数据仓库双集群系统模式探讨,看GaussDB(DWS)的容灾设计

    摘要:本文主要是探讨OLAP关系型数据库框架的数据仓库平台如何设计双集群系统,即增强系统高可用的保障水准,然后讨论一下GaussDB(DWS)的容灾应该如何设计. 当前社会.企业运行当中,大数据分析. ...

  7. Codeforces Round #660 (Div. 2) A、B、C题解

    A. Captain Flint and Crew Recruitment #构造 题目链接 题意 定义一类正整数,能够被\(p*q\)表示,其中\(p.q(1<p<q)\)均为素数,称之 ...

  8. E. Number of Simple Paths 题解(思维)

    题目链接 题目大意 给你n个点(\(\sum n<=2e5\)),n条边,求有多少条路径 题目思路 要明白任意两点的路径只能是1条或者2条 先topo找环(双向边也是可以找的) 然后把环上的每个 ...

  9. SpringCloud 源码系列(1)—— 注册中心 Eureka(上)

    Eureka 是 Netflix 公司开源的一个服务注册与发现的组件,和其他 Netflix 公司的服务组件(例如负载均衡.熔断器.网关等)一起,被 Spring Cloud 整合为 Spring C ...

  10. JDK8HashMap的一些思考

    JDK8HashMap 文中提及HashMap7的参见博客https://www.cnblogs.com/danzZ/p/14075147.html 红黑树.TreeMap分析详见https://ww ...