Skip to content

Instantly share code, notes, and snippets.

@iomonad
Created July 15, 2023 09:52
Show Gist options
  • Save iomonad/e4f5e7a4ef4e2dbfa5919d7280c8196f to your computer and use it in GitHub Desktop.
Save iomonad/e4f5e7a4ef4e2dbfa5919d7280c8196f to your computer and use it in GitHub Desktop.
Compress Image in Pure Clojure
(ns arkana.lib.images
"Image manipulation namespace, provides some
utilities to compress & deal with images formats"
(:import java.io.File
java.io.FileOutputStream
javax.imageio.ImageIO
javax.imageio.IIOImage
javax.imageio.ImageWriteParam
java.awt.image.BufferedImage)
(:require [clojure.java.io :as io]))
(defn compress-image
"Compress image with ratio (default 0.7)
Usage:
(compress-image (io/file \"/tmp/foo.png\")
(io/file \"/tmp/ouput.jpg\"
:compression-level 0.5)
;; => on success yied output file instance
"
[^File input ^File output & {:keys [compression-quality extension]
:or {compression-quality 0.7
extension "jpg"}}]
(try
(let [initial (ImageIO/read input)
writers (ImageIO/getImageWritersByFormatName extension)
writer (.next writers)]
(with-open [os (FileOutputStream. output)]
(with-open [ios (ImageIO/createImageOutputStream os)]
(let [param (.getDefaultWriteParam writer)]
(.setOutput writer ios)
(.setCompressionMode param ImageWriteParam/MODE_EXPLICIT)
(.setCompressionQuality param compression-quality)
(.write writer nil (IIOImage. initial nil nil) param))))
;; Yield output for direct `File` usages in pipelines
output)
(catch Exception e
{:failure (.getMessage e)})))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment