You can import an image (PNG or JPEG) to R with the image_read function from the magick package. If you assign the result to an object then you can print it with the print function. Note that you can set info = FALSE to avoid printing the information about the image.
# install.packages("magick")
library(magick)
# Reading a PNG
image <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
# Printing the image
print(image, info = FALSE)

Get the image details
If you want to obtain the width, height and other details about the image you can use the image_info function and assing the result to a variable. Then, you will be able to access each of the elements, such as the width and height of the imported image.
# install.packages("magick")
library(magick)
image <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
# Image details
info <- image_info(image)
# See the details
print(info)
# You can also access to each element
info$width # 250px
info$height # 250px
format width height colorspace matte filesize density
1 PNG 720 893 sRGB TRUE 68794 72x72
Read a SVG
With the image_read_svg function you will be able to import a SVG file. In this scenario, you will need to set the width and height with the corresponding arguments.
# install.packages("magick")
library(magick)
# Read a SVG
tiger <- image_read_svg('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/tiger.svg',
width = 500, height = 500)
print(image, info = FALSE)

You can convert an image to other formats with the image_convert function, specifying the desired output format in the format argument of the function.
Read a PDF document as image
The image_read_pdf function allows reading PDF documents and transforming each page into a PNG. You can choose any page or pages with the pages argument, but if not specified, all pages will be converted and then you will be able to see all.
# install.packages("magick")
# install.packages("pdftools")
library(magick)
# Read a PDF
pdf_doc <- image_read_pdf('https://cran.r-project.org/web/packages/calendR/calendR.pdf')
# All pages
pdf_doc
# Page 1
pdf_doc[[1]]
# Read only page one
pdf_page <- image_read_pdf('https://cran.r-project.org/web/packages/calendR/calendR.pdf', pages = 1)
pdf_page

It is possible to extract the text from an image with the image_ocr function. For instance, in the previous example you could write cat(image_ocr(pdf_doc)) to extract the text. Note that the tesseract package must be installed in order to work.
There are several functions to export the images, gifs and videos created with magick package. These functions are: image_write, image_write_gif and image_write_video.
The magick package provides several functions to scale, crop, trim, rotate and paint images. These functions will be highlighted in the following blocks of code.
Scale the image to a specific width
If your image is too big or too small you can make use of the image_scale function to scale it to the desired size. By default, you can input an integer as character to scale the width of the image to that size in pixels.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_scale(r, "200")

Scale the image to a specific height
If you add an x before the number instead of width the number will be interpreted as the desired height of the scaled image.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_scale(r, "x400")

Trim the margins of the image
If your image is a PNG and the transparent area is big you can use the image_trim function to trim the margins of the image.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_trim(r)

Crop the image
Making use of the image_crop function you can crop the image. In order to crop an image you will need to specify a geometry indicating the width and height for the resulting image and where to make the crop.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
# Width: 200px, height: 300px,
# starting at +200px from the left and 300 from the top
image_crop(r, geometry = "200x300+200+300")

Rotating the image
With image_rotate you can rotate the image the angle specified in degrees.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_rotate(r, degrees = 45)

Vertical flip
The image_flip function is a shortcut if you want to flip the image vertically instead of specifying the degrees.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_flip(r)

Horizontal flip (mirror)
You can mirror the image (horizontal flip) with the image_flop function, as shown in the example below.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_flop(r)

Background color
If your image is a PNG with transparent background you can set a background color with the image_background function. The color can be specified using the color argument.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_background(r, color = "#cbe7ff")

Adding a border
You can add a border to your image with image_border. For that purpose, you will need to specify a color and a geometry. In the following example we are creating a border with a height of 8 pixels and width of 10 pixels. An alternative function to add a border is image_frame.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_border(r, color = "#cbe7ff", geometry = "8x10")

Fill with color at a specific point
The image_fill function allows changing a specific color that exists on a point. In the following example we are changing the color to blue at "+420+520", which means that the point is placed at x = 420 and y = 520 coordinates, but note that the image of the sample has gradient colors, so the result is not good. This function will be very useful, for instance, to change the background color of a PNG file.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_fill(r, "blue", "+420+540")

With image_annotate it is possible to add texts over images. You just need to pass the desired image and the text and then set the size, the angle, the gravity (type gravity_types() for the list of available options) or locations and other styling, such as the color, stroke, weight or font family with the arguments provided by the function.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_annotate(r, "Text over an image", size = 75, gravity = "center", color = "black")

Text inside a box
Note that the function also provides an argument named boxcolor that can be set to any color to create a box around the text.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_annotate(r, "Text over an image", size = 75, gravity = "center", color = "black",
degrees = 45, boxcolor = "white")

Adding blur
You can distort an image by adding blur to it with the image_blur function. This function provides two arguments named radius (defaults to 1) and sigma (defaults to 0.5) to customize the level of blur.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_blur(r, radius = 10, sigma = 5)

Adding noise
The image_noise function allows adding noise to the image. By default, the noise is gaussian, but you can check the available noise types with noise_types().
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_noise(r)

Invert the color
With image_negate you will be able to invert the colors of the image.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_negate(r)

Charcoal effect
The magick package also provides some effects, such as the charcoal effect with image_charcoal.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_charcoal(r)

Implode effect
Other effect is the implode effect, which will implode the image based on a implode factor.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_implode(r, factor = 0.75)

Oil paint effect
The last effect we are going to highlight is the oil paint effect that can be created with the image_oilpaint function.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
image_oilpaint(r, radius = 10)

The package provides other effects, such as image_despeckle, image_reducenoise, image_motion_blur and image_emboss.
It is possible to draw over the images making use of the image_draw function. You just need to set draw and then start adding base R elements, such as lines, text, markers, etc. Recall that you can get the width and height of the image with image_info, so you will know the axis limits.
# install.packages("magick")
library(magick)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
# Get the size of the image before drawing
info <- image_info(r)
width <- info$width
height <- info$height
# Set an image_draw object
img <- image_draw(r)
# Add some elements
abline(h = height / 2, col = 'blue', lwd = '10', lty = "dotted")
abline(v = width / 2, col = 'blue', lwd = '10', lty = "dotted")
rect(xleft = (width / 2) - 75, ybottom = (height / 2) - 75,
xright = (width / 2) + 75, ytop = (height / 2) + 75, border = "red", lwd = 5)
text(600, 600, "Text", cex = 5)
dev.off()

Appending images side by side
It is possible to append several images with the image_append function. By default, the function will append the images side by side, but the images can also be stacked when stack = TRUE.
# install.packages("magick")
library(magick)
# Read some images
r1 <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
r2 <- image_read_svg('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/tiger.svg', width = 500, height = 500)
# Join the images
r <- c(r1, r2)
# Append the images
image_append(r)

Combining several images
You can combine several images with the image_mosaic function. An alternative is image_flatten, which will combine the images based on the size of the first image.
# install.packages("magick")
library(magick)
# Read some images
r1 <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
r2 <- image_read_svg('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/tiger.svg', width = 500, height = 500)
# Join the images
r <- c(r1, r2)
# Combine the images
image_mosaic(r)

Composing several images
The image_composite function composes an image over another using an operator. The default operator is "atop", but you can write compose_types() in order to get the full list of available operators.
# install.packages("magick")
library(magick)
# Read some images
r1 <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
r2 <- image_read_svg('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/tiger.svg', width = 500, height = 500)
# Compose the images
image_composite(image = r1, composite_image = r2)

Image over ggplot2 chart
A really interesting feature of the magick package is that allows adding the images over your charts. There are several alternatives to add them, but the best way is to use the grid.raster function from the grid package, as shown in the following example.
# install.packages("magick")
# install.packages("ggplot2")
# install.packages("grid")
library(magick)
library(ggplot2)
library(grid)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png') %>%
image_trim()
# ggplot2 plot
qplot(Sepal.Length, Sepal.Width, data = iris, geom = c("point", "smooth"))
# Image over plot at the center
grid.raster(r,
x = 0.5, y = 0.5,
width = unit(150, "points"))

Image over base R chart
Images can also be added to base R charts using the same function as the one used in the previous example.
# install.packages("magick")
# install.packages("grid")
library(magick)
library(grid)
r <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png') %>%
image_trim()
# Plot
plot(1:10, pch = 16, cex = 5, col = rainbow(10))
# Image over plot at the center
grid.raster(r,
x = 0.5, y = 0.5,
width = unit(100, "points"))

The image_animate function allows animating several images. By default the animation is at 10 frames per second but you can customize them with fps. You can also customize the disposal method with dispose, which possible values are "background", "previous" and "none".
# install.packages("magick")
library(magick)
# Read some images
r1 <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
r2 <- image_read_svg('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/tiger.svg', width = 500, height = 500)
# Join the images
r <- c(r1, r2)
# Create a 1fps gif
image_animate(r, fps = 1, dispose = "previous")

With image_morph you can create a smooth transition between images. In the following example we are creating a transition between the normal image and the negative of the image.
# install.packages("magick")
library(magick)
# Read some images
r1 <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png')
r2 <- image_read('https://raw.githubusercontent.com/R-CoderDotCom/samples/main/bird.png') %>%
image_negate()
# Join the images
r <- c(r1, r2)
# Animate with transition
r %>%
image_morph() %>%
image_animate(optimize = TRUE)

You can also add gifs to your plots making use of several functions. You will need to use the image_graph function, create your plot, combine the gif and the plot with image_composite and then you can use the image_animate function to create the animation.
# install.packages("magick")
library(magick)
# install.packages("ggplot2")
library(ggplot2)
gif_image <- image_read("https://raw.githubusercontent.com/R-CoderDotCom/samples/main/homer.gif") %>%
image_scale("250")
fig <- image_graph(width = 500, height = 500)
# Data
data <- data.frame(x = 1:12,
y = c(0, 100, 200, 457, 479, 550,
668, 800, 851, 880, 900, 1000))
ggplot(data, aes(x = x, y = y)) +
geom_text(aes(x = 4, y = 750, label = "magick package"), size = 10) +
geom_line(color = "blue", alpha = 0.9, linetype = 2)
dev.off()
# Composing the full image
out <- image_composite(fig, gif_image, offset = "+70+20", gravity = "southeast")
# Animation of the image
animation <- image_animate(out, fps = 10, optimize = TRUE)
# Show the image
print(animation, info = FALSE)

See also