Optimize and compress images using 'Rust' libraries to reduce file sizes while maintaining image quality. Supports PNG palette reduction and dithering via the 'exoquant' crate before lossless PNG optimization via the 'oxipng' crate, and JPEG re-encoding via the 'mozjpeg' crate. The package provides functions to optimize individual image files or entire directories, with configurable compression levels. Use tinyimg() as a convenient entry point for mixed PNG/JPEG workflows.
An R package for optimizing and compressing images using Rust libraries. Supports PNG optimization via exoquant (lossy palette reduction) and oxipng (lossless optimization), and JPEG re-encoding via mozjpeg.
You can install the development version of {tinyimg} from r-universe.dev:
install.packages("tinyimg", repos = "https://yihui.r-universe.dev")
library(tinyimg)
# Optimize all images in a directory (PNG and JPEG)
tinyimg("path/to/directory")
# Optimize specific files (mixed formats)
tinyimg(c("photo.jpg", "diagram.png"))
# Create a test PNG
tmp = tempfile()
png(tmp, width = 400, height = 400)
plot(1:10)
dev.off()
# Optimize with different levels (lossless)
tinypng(tmp, paste0(tmp, "-o1.png"), level = 1)
tinypng(tmp, paste0(tmp, "-o6.png"), level = 6)
# Lossy
tinypng(tmp, paste0(tmp, "-lossy.png"), lossy = 2.3)
# Create a test JPEG
tmp = tempfile(fileext = ".jpg")
jpeg(tmp, width = 400, height = 400)
plot(1:10)
dev.off()
# Optimize with default quality (75)
tinyjpg(tmp)
# Optimize to a new file at a lower quality
tinyjpg(tmp, paste0(tmp, "-q60.jpg"), quality = 60)
For PNG, the level parameter controls the optimization level (0-6):
0: Fast optimization with minimal compression2: Default - good balance between speed and compression6: Maximum optimization - best compression but slowerFor JPEG, the quality parameter (0-100) controls the trade-off between
quality and file size; higher quality means larger files and vice versa.
See the benchmark results (for png and jpeg) for
detailed comparisons, and ?tinyimg for full documentation.
When installing from GitHub via remotes::install_github("yihui/tinyimg"), the package will automatically create the vendor directory if Rust is installed on your system.
If you're developing and need to manually create the vendor directory:
# Run the update script to create vendor/ directory
./src/rust/update-vendor.sh
This creates the local vendor/ directory needed for development. Neither vendor/ nor vendor.tar.xz are tracked in git.
MIT License. See LICENSE file for details.