stackoverflow, “R magick: Square crop and circular mask”을 참조하여 일반 사진을 어떻게 졸업앨범 느낌이 나는 사진으로 변환하는지 살펴보자.
library(tidyverse)
library(magick)
<- magick::image_read("https://cdn.pixabay.com/photo/2016/08/17/21/12/people-1601516_960_720.jpg")
im
# get height, width and crop longer side to match shorter side
<- magick::image_info(im)
ii <- min(ii$width, ii$height)
ii_min <- magick::image_crop(im, geometry=paste0(ii_min, "x", ii_min, "+0+0"), repage=TRUE)
im1
# create a new image with white background and black circle
<- magick::image_draw(image_blank(ii_min, ii_min))
fig symbols(ii_min/2, ii_min/2, circles=(ii_min/2)-3, bg='black', inches=FALSE, add=TRUE)
dev.off()
quartz_off_screen
2
# create an image composite using both images
<- magick::image_composite(im1, fig, operator='copyopacity')
im2
# set background as white
<- magick::image_background(im2, 'white')
graduate_im
# 내보내기 --------------
# image_append(c(im, image_blank(ii_min, ii_min, color = "white"), graduate_im)) %>%
# image_write(path = "fig/graduation.png")
먼저 스크립트를 함수로 변환시키는 코드를 작성하고 테스트를 한다.
<- function() {
create_figure
<- magick::image_read("https://cdn.pixabay.com/photo/2016/08/17/21/12/people-1601516_960_720.jpg")
img
<- magick::image_info(img)
ii <- min(ii$width, ii$height)
ii_min <- magick::image_crop(img, geometry=paste0(ii_min, "x", ii_min, "+0+0"), repage=TRUE)
cropped_img
<- magick::image_draw(image_blank(ii_min, ii_min))
fig symbols(ii_min/2, ii_min/2, circles=(ii_min/2)-3, bg='black', inches=FALSE, add=TRUE)
dev.off()
<- magick::image_composite(cropped_img, fig, operator='copyopacity')
im2
<- magick::image_background(im2, 'white')
created_img
return(created_img)
}
create_figure()
고정된 사진이 아니라 인자를 달리하여 입력되는 사진을 졸얼앨범 사진으로 제작하도록 로직을 변경한다.
<- function(figure) {
create_figure
<- magick::image_read(figure) %>%
img image_resize(300)
<- magick::image_info(img)
ii <- min(ii$width, ii$height)
ii_min <- magick::image_crop(img, geometry=paste0(ii_min, "x", ii_min, "+0+0"), repage=TRUE)
cropped_img
<- magick::image_draw(image_blank(ii_min, ii_min))
fig symbols(ii_min/2, ii_min/2, circles=(ii_min/2)-3, bg='black', inches=FALSE, add=TRUE)
dev.off()
<- magick::image_composite(cropped_img, fig, operator='copyopacity')
im2
<- magick::image_background(im2, 'white')
created_img
return(created_img)
}
create_figure("fig/rconf/julia_silge.jpg")
create_figure()
함수를 사용해서 특정 디렉토리에 포함된 모든 사진을 자동변환시켜보자.
<- fs::dir_ls("fig/rconf")
fig_list
<- map(fig_list, create_figure)
fig_processed_list
## list --> image 객체
<- image_join(fig_processed_list)
fig_join_img
image_append(fig_join_img, stack = FALSE)
create_figure()
함수 조정해서 처리된 결과를 메모리상 magick
객체로 두는 것이 아니라 로컬 컴퓨터에 저장시켜보자. fs::path_ext_remove()
함수를 사용해서 파일 확장자를 제거하고 _processed.png
파일을 저장시킨다.
<- function(figure) {
create_figure
<- magick::image_read(figure) %>%
img image_resize(300)
<- magick::image_info(img)
ii <- min(ii$width, ii$height)
ii_min <- magick::image_crop(img, geometry=paste0(ii_min, "x", ii_min, "+0+0"), repage=TRUE)
cropped_img
<- magick::image_draw(image_blank(ii_min, ii_min))
fig symbols(ii_min/2, ii_min/2, circles=(ii_min/2)-3, bg='black', inches=FALSE, add=TRUE)
dev.off()
<- magick::image_composite(cropped_img, fig, operator='copyopacity')
im2
<- magick::image_background(im2, 'white')
created_img
%>%
created_img image_write(path = glue::glue("{fs::path_ext_remove(figure)}_processed.png"))
return(created_img)
}
create_figure("fig/rconf/julia_silge.jpg")
앞서 작업한 결과를 확인해보자.
image_read("fig/rconf/julia_silge_processed.png")
특정 디렉토리에 있는 모든 파일을 처리해서 자동화시키자.
<- fs::dir_ls("fig/rconf")
fig_list walk(fig_list, create_figure)
fs
팩키지 dir_ls()
함수 glob
기능을 이용하여 작업 내용을 확인해보자.
::dir_ls("fig/rconf", glob = "*processed.png") fs
fig/rconf/choonghyun_ryu_processed.png
fig/rconf/choonghyun_ryu_processed_processed.png
fig/rconf/jaesung_choi_processed.png
fig/rconf/jaesung_choi_processed_processed.png
fig/rconf/julia_silge_processed.png
fig/rconf/julia_silge_processed_processed.png
fig/rconf/kwangchun_lee_processed.png
fig/rconf/kwangchun_lee_processed_processed.png
fig/rconf/sooheang_eo_processed.png
fig/rconf/sooheang_eo_processed_processed.png
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com