Created
July 15, 2023 09:52
-
-
Save iomonad/e4f5e7a4ef4e2dbfa5919d7280c8196f to your computer and use it in GitHub Desktop.
Compress Image in Pure Clojure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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