当前位置:   article > 正文

R语言也能玩ps?magick包你值得拥有

install.packages("rmagic")
0.png

事情是这样的,最近好几天没发推文,昨天登录进去突然发现新增关注人里面有几位数据科学大咖,惊喜之余又诚惶诚恐。昨夜思来想去,下决心要提升公众号文章质量,无非是多花一点时间在上面,但写公众号对于知识沉淀和扩大交流百利无害。大家都很忙,没人会花宝贵的时间点开你毫无技术又毫无营养的文章。在数量上做减法,在质量上做加法。以上。                                                                                          ——louwill

今天要给大家介绍的是2017年的一款新包——magick包。可能大家看到推文题目也都知道了,这是一款图片与图像处理的扩展包,以后ps能做的R语言一定程度上也可以做啦。毕竟从大数据的角度来讲,图片图像数据也是数据嘛。话不多说,小编带大家直接上手magick包。

安装

安装和载入magick包后,可查看在R语言中支持哪些图片格式。

  1. install.packages("magick")
  2. library(magick)
  3. str(magick::magic_config())

  1. ## List of 21
  2. ##  $ version           :Class 'numeric_version'  hidden list of 1
  3. ##   ..$ : int [1:4] 6 9 6 6
  4. ##  $ modules           : logi FALSE
  5. ##  $ cairo             : logi TRUE
  6. ##  $ fontconfig        : logi TRUE
  7. ##  $ freetype          : logi TRUE
  8. ##  $ fftw              : logi FALSE
  9. ##  $ ghostscript       : logi FALSE
  10. ##  $ jpeg              : logi TRUE
  11. ##  $ lcms              : logi FALSE
  12. ##  $ libopenjp2        : logi FALSE
  13. ##  $ lzma              : logi TRUE
  14. ##  $ pangocairo        : logi TRUE
  15. ##  $ pango             : logi TRUE
  16. ##  $ png               : logi TRUE
  17. ##  $ rsvg              : logi TRUE
  18. ##  $ tiff              : logi TRUE
  19. ##  $ webp              : logi TRUE
  20. ##  $ wmf               : logi FALSE
  21. ##  $ x11               : logi FALSE
  22. ##  $ xml               : logi TRUE
  23. ##  $ zero-configuration: logi FALSE

可见magick包在R语言中支持大部分图片格式,常见的jpeg和png格式就足以解决大部分图片格式问题。

图片输入与输出

magick包可以通过image_read函数直接从文件路径、URL和图片数据原始向量中读入图片,读入成功可以显示图片的一些基本信息。先读入一只老虎看看:

  1. tiger <- image_read('http://jeroen.github.io/images/tiger.svg')
  2. image_info(tiger)

  1. ##   format width height colorspace filesize
  2. ## 1    png   900    900       sRGB        0

0?wx_fmt=png

图片读入之后还可以通过image_write函数将图片输出,另存为任何图片格式也是可以的。

 
 

图片处理

如果是仅仅读入读出图片,那magick包也没多大意义了。一般图片处理软件中的功能magick也可以处理。

裁剪与编辑

magick提供了一些形如AxB+C+D一类的转换函数来实现对图片的裁剪与编辑处理。比如说:

  • image_crop(image, "100x150+50")

  • image_scale(image, "200")

  • image_scale(image, "x200")

  • image_fill(image, "blue", "+100+200")

  • image_border(frink, "red", "20x10")

下面通过实例看看各函数用法含义。

先读入一个celtic图片:

 
 

0?wx_fmt=png

加个20x10的绿框看看:

 
 

0?wx_fmt=png

从右边裁掉5个尺寸:

 
 

0?wx_fmt=png

放个大看看:

 
 

0?wx_fmt=png

换个边儿看看:

 
 

0?wx_fmt=png

其他的像旋转、倒置、缩放等操作都是有类似函数可以处理的,具体可查阅magick帮助文档。

再上个背景色,把绿凯变成粉凯:

 
 

0?wx_fmt=png

虚化一下绿凯:

0?wx_fmt=png

类似的处理操作有点多,小编就不一一展示了。有兴趣的朋友可以自己去探索。

添加文本

magick包也提供了为图片添加文本信息的功能,且看实例。

为绿凯喊个口号:

image_annotate(celtics, "Beat LA!", size = 35, gravity = "southwest", color = "green")

0?wx_fmt=png

管道操作进行链接

如果你嫌一次只进行一个处理太麻烦,magick和magrittr包联合使用大可以让你实现这些操作。相信你在dplyr包中已经见识到了这些%>%管道操作符的厉害了。

  1. library(magrittr)
  2. image_read("F:/R/celtics.png") %>%
  3.  image_rotate(270) %>%
  4.  image_background("pink", flatten = TRUE) %>%
  5.  image_border("green", "10x10") %>%
  6.  image_annotate("Beat LA!", color = "black", size = 30)

0?wx_fmt=png

图片向量

以上都是针对单张图片进行处理的。magick包里面所有函数都具有向量化功能,可以支持图层叠加、拼图以及动图处理。先看个动态的地球:

  1. earth <- image_read("https://jeroen.github.io/images/earth.gif")
  2. earth <- image_scale(earth, "200")
  3. length(earth)

print(earth)

0?wx_fmt=gif

叠加

我们也可以像在ps里面一样进行图层叠加。

  1. bigdata <- image_read('https://jeroen.github.io/images/bigdata.jpg')
  2. frink <- image_read("https://jeroen.github.io/images/frink.png")
  3. logo <- image_read("https://www.r-project.org/logo/Rlogo.png")
  4. img <- c(bigdata, logo, frink)
  5. img <- image_scale(img, "300x300")
  6. image_info(img)

  1. ##   format width height colorspace filesize
  2. ## 1   JPEG   300    225       sRGB        0
  3. ## 2    PNG   300    263       sRGB        0
  4. ## 3    PNG   148    300       sRGB        0
image_mosaic(img)

0?wx_fmt=jpeg

组合

也可以把几张图片组合在一起。虽然比较丑,但重在功能展示一下。

  1. left_to_right <- image_append(image_scale(img, "x200"))
  2. image_background(left_to_right, "white", flatten = TRUE)

0?wx_fmt=jpeg

加个stack参数也可以竖着组合,这里不再演示。

扫描文档为图片

magick还可以将指定PDF文档扫描为png等图片格式的形式。且看例子:

  1. manual <- image_read('https://cran.r-project.org/web/packages/magick/magick.pdf', density = "72x72")
  2. image_info(manual)
  3. image_convert(manual[1], "png", 8)

这里需要借助pdftools包来实现:

  1. library(pdftools)
  2. bitmap <- pdf_render_page('https://cran.r-project.org/web/packages/magick/magick.pdf',  page = 1, dpi = 72, numeric = FALSE)
  3. image_read(bitmap)

0?wx_fmt=png

动图

magick做GIF动图也是毫无压力的:

image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous")

0?wx_fmt=gif

最后展示一个R logo的动态图:

  1. newlogo <- image_scale(image_read("https://www.r-project.org/logo/Rlogo.png"), "x150")
  2. oldlogo <- image_scale(image_read("https://developer.r-project.org/Logo/Rlogo-3.png"), "x150")
  3. frames <- image_morph(c(oldlogo, newlogo), frames = 10)
  4. image_animate(frames)

0?wx_fmt=gif

总结

从上面的演示大家也都看到了,magick包包含了大部分ps所具备的功能,以后用R语言p个图什么的也都是分分钟的事啦。

参考资料:

http://127.0.0.1:19145/library/magick/doc/intro.html

    

0?wx_fmt=jpeg

一个数据科学践行者的学习日记

640?
640?wx_fmt=jpeg
长按二维码.关注数据科学家养成记

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/891323
推荐阅读
相关标签
  

闽ICP备14008679号