;; -*- lexical-binding: t -*- (require 'image) (require 'seq) (defcustom ennum-image-convert-path "convert" "Path to imagemagick convert executable." :type 'string :group 'ennum) (defcustom ennum-image-identify-path "identify" "Path to imagemagick identify executable." :type 'string :group 'ennum) (defcustom ennum-image-jpegtran-path "jpegtran" "Path to jpegtran executable." :type 'string :group 'ennum) (defcustom ennum-image-optipng-path "optipng" "Path to optipng executable." :type 'string :group 'ennum) ;; Check if all necessary image types are supported (seq-do (lambda (image-type) (unless (image-type-available-p image-type) (lwarn '(ennum) :error "`%s' image type not supported" image-type))) '(jpeg png svg)) ;; Check for existence of external image processing utilities (seq-do (lambda (external-program) (unless (executable-find external-program) (lwarn '(ennum) :error "`%s' not found" external-program))) (list ennum-image-convert-path ennum-image-identify-path ennum-image-jpegtran-path ennum-image-optipng-path)) (defun ennum-image-resize-image (infile-path outfile-path width) "A simple shell wrapper around ImageMagick's convert" (ennum-image--assert-file-exists infile-path) (cl-case (image-type infile-path) (svg (copy-file infile-path outfile-path t)) (otherwise (call-process ennum-image-convert-path nil nil nil infile-path "-resize" (format "%d>" width) outfile-path))) outfile-path) (defun ennum-image-optimize-image (image-path) "A simple shell wrapper around jpegtran and optipng" (ennum-image--assert-file-exists image-path) (cl-case (image-type image-path) (jpeg (call-process ennum-image-jpegtran-path nil nil nil "-optimize" "-progressive" "-copy" "none" "-outfile" image-path image-path)) (png (call-process ennum-image-optipng-path nil nil nil image-path))) image-path) (defun ennum-image-get-width (image-path) (ennum-image--assert-file-exists image-path) (cl-case (image-type image-path) (svg 1e+INF) (otherwise (with-temp-buffer (call-process ennum-image-identify-path nil t nil "-format" "%w" image-path) (string-to-number (buffer-string)))))) (defun ennum-image--assert-file-exists (path) (unless (file-exists-p path) (error "File %s does not exist" path))) (provide 'ennum-image)