magick包:图像处理扩展包

magick包:图像处理扩展包

R语言中文社区推文学习笔记

该包可以用于图片处理和GIF的创建。

查看该包支持的图片格式

R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
library(magick)
# 查看该包支持的图片格式
str(magick_config())

# 结果
List of 21
$ version :Class 'numeric_version' hidden list of 1
..$ : int [1:4] 6 9 9 39
$ modules : logi FALSE
$ cairo : logi TRUE
$ fontconfig : logi TRUE
$ freetype : logi TRUE
$ fftw : logi FALSE
$ ghostscript : logi FALSE
$ jpeg : logi TRUE
$ lcms : logi TRUE
$ libopenjp2 : logi TRUE
$ lzma : logi TRUE
$ pangocairo : logi TRUE
$ pango : logi TRUE
$ png : logi TRUE
$ rsvg : logi TRUE
$ tiff : logi TRUE
$ webp : logi TRUE
$ wmf : logi FALSE
$ x11 : logi FALSE
$ xml : logi TRUE
$ zero-configuration: logi TRUE

也就是说基本的都支持。

读入图片&查看图片信息

R
1
2
3
4
5
6
7
8
(tiger <- image_read('https://jeroen.github.io/images/tiger.svg'))
# 查看图片的信息
image_info(tiger)

# A tibble: 1 x 7
format width height colorspace matte filesize density
<chr> <int> <int> <chr> <lgl> <int> <chr>
1 SVG 900 900 sRGB TRUE 68630 96x96

R
1
2
# 保存图片
image_write(tiger, "tiger.png", format = 'png')

剪裁和编辑

R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 添加一个20x20的橘黄色边框
(tiger1 <- image_border(tiger, "orange", "20x20"))

# 从左边裁掉50个尺寸
(tiger2 <- image_crop(tiger1, "940x940+50"))

# 缩小像素到100
(tiger3 <- image_scale(tiger1, "100"))

# 镜像
(tiger4 <- image_flop(tiger))

# 加个粉色的背景(对这个图没有效果)
(tiger5 <- image_background(tiger, 'pink', flatten = T))

# 虚化
(tiger6 <- image_blur(tiger, 10, 5))

# 使用管道操作符
library(magrittr)
image_read('https://jeroen.github.io/images/tiger.svg') %>%
image_rotate(270) %>%
image_background("pink", flatten = TRUE) %>%
image_border("orange", "30x30")

gif图会被读为图片向量

R
1
2
3
4
(earth <- image_read("https://jeroen.github.io/images/earth.gif"))
length(earth)
# [1] 44
print(earth[1])

自制GIF图

R
1
2
3
4
5
(bigdata <- image_read("https://jeroen.github.io/images/bigdata.jpg"))
(frink <- image_read("https://jeroen.github.io/images/frink.png"))
(logo <- image_read("https://www.r-project.org/logo/Rlogo.png"))
(img <- c(bigdata, logo, frink)) #三个图片会连续轮流播放
image_write(img, "20181124.gif", "gif")

R
1
2
3
(img1 <- image_animate(image_scale(img, "200x200"),
fps = 1, dispose = "previous"))
image_write(img1, "20181124.gif", "gif")

下面的代码以这幅图为例:

R
1
2
3
4
5
6
7
# 放大或缩小的效果
logo <- image_read('WechatIMG41.jpeg')
newlogo <- image_scale(logo, "x500")
oldlogo <- image_scale(logo, "x600")
frames <- image_morph(c(oldlogo, newlogo), frames = 10)
img2 <- image_animate(frames)
image_write(img2, "20181124a2.gif", "gif")

扫描文档为图片

R
1
2
3
4
5
6
7
8
9
10
11
12
(manual <- image_read("https://cran.r-project.org/web/packages/magick/magick.pdf", density = "72x72"))

image_info(manual)
image_convert(manual[1], "png")

library(pdftools)
bitmap <- pdf_render_page("https://cran.r-project.org/web/packages/magick/magick.pdf",
page = 1,
dpi = 72,
numeric = F)
(pdf <- image_read(bitmap))
image_write(pdf, "pdf.png", format = "png")

# R

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了607.9k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×