tinyimg: Optimize and Compress Images

2026-06-15

Title Optimize and Compress Images
Version 0.4.5
Description 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.
Suggests testit
License MIT + file LICENSE
URL https://github.com/yihui/tinyimg
BugReports https://github.com/yihui/tinyimg/issues
Author Yihui Xie ORCID iD [aut, cre, cph], Authors of the dependency Rust crates [ctb, cph]

R-CMD-check CRAN release

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.

1 Installation

You can install the development version of {tinyimg} from r-universe.dev:

install.packages("tinyimg", repos = "https://yihui.r-universe.dev")

2 Usage

2.1 Optimize PNG and JPEG images

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"))

2.2 PNG optimization

# 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)

2.3 JPEG optimization

# 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)

2.4 Optimization levels and quality

For PNG, the level parameter controls the optimization level (0-6):

For 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.

3 For Package Developers

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.

4 License

MIT License. See LICENSE file for details.

Appendix

To cite the package tinyimg in publications, please use:

Xie Y (2026). tinyimg: Optimize and Compress Images. R package version 0.4.5, https://github.com/yihui/tinyimg.

@Manual{,
  title = {tinyimg: Optimize and Compress Images},
  author = {Yihui Xie},
  year = {2026},
  note = {R package version 0.4.5},
  url = {https://github.com/yihui/tinyimg},
}