在上一篇中,我们了解了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. springboot项目启动报错Communications link failure

    环境情况,MySQL版本如下: 报错情况如下(看上去是和数据库有关): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communi ...

  2. 带你入门Camtasia Studio录像机软件

    Camtasia软件和其他录制软件不同,不论是编辑功能还是制作功能还是其他功能方面都远远高于其他录制软件.那这边我们可以一起了解一下基础软件功能. 首先,我们在电脑端安装了软件以后,进行实际操作.在操 ...

  3. iMindMap:一款可以免费试用的思维导图软件

    思维导图在我们的生活中已经越来越常见了,在市场上也有很多思维导图的软件.今天小编给大家推荐的是一款免费思维导图软件-iMindMap.它具有22种布局模式,包含组织架构图.鱼骨图.时间线.气泡图等,3 ...

  4. HMM、CTC、RNN-T训练是所有alignment的寻找方法

    1.1 LAS产生label的计算   LAS是可以看做能够直接计算给定一段acoustic feature时输出token sequences的概率,即\(p(Y|X)\),LAS每次给定一个aco ...

  5. 体育成绩统计/ Score

    偏水向,请部分学术控谅解 题目过长,不再描述. 很显然就是一道大模拟对吧,我在这里贡献一下我打此题的思路与过程. 或许有些奇淫巧技可以供一些没有过掉的神犇借鉴一下. 2020.11.26 中午: 昨天 ...

  6. linux上的PXE装机服务的搭建

    PXE 先安装一下依赖服务 yum -y install vsftpd dhcp tftp syslinux tftp-server cd /var/ftp/pub/ mkdir dvd 设置权限 c ...

  7. 【linux】i2c使用分析&源码实战

    目录 前言 1. 设备检查命令 1.1 查看I2C驱动 1.2 i2c-tools 1.2.1 I2C-detect安装 1.2.2 i2cdetect 命令 1.2.3 i2cget 命令 1.2. ...

  8. vue跨域请求

    浏览器的同源策略 同源 协议相同 域名相同 端口相同 同源目的 保证用户信息安全,防止恶意的网站窃取数据 同源策略解决方法 jsonp cors 代理解决跨域 settings.py INSTALLE ...

  9. Docker 入门介绍

    Docker是什么 从发布到现在 docker一直很受关注,在一定程度是改变了软件行业 如果你还不知道 docker 是什么是不是有点out了,接下来我们来介绍docker是什么,解决了什么问题,好处 ...

  10. 下载centos镜像的地址