rlm@2: (ns clojure-magick.magick) rlm@2: (import [org.im4java.core ConvertCmd IMOperation Stream2BufferedImage] ) rlm@2: rlm@2: (defn read-image "Read the image in the specified file; returns a BufferedImage." [filename] rlm@2: (let [op (doto (IMOperation.) rlm@2: (.addImage (into-array String [filename])) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object []))) rlm@2: (.getImage s2b)) rlm@2: ) rlm@2: rlm@2: (defn write-image "Write the image to the specified file." [img filename] rlm@2: (let [op (doto (IMOperation.) rlm@2: (.addImage) rlm@2: (.addImage))] rlm@2: (.run (ConvertCmd.) op (into-array Object [img filename]))) rlm@2: ) rlm@2: rlm@2: rlm@2: (defn glue-vertical "Concatenate images in a sequence from top to bottom, producing a new image." [image & imgs] rlm@2: (let [imgs (cons image imgs) rlm@2: op (doto (IMOperation.) rlm@2: (.addImage (count imgs)) rlm@2: (.append) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object (vec imgs)))) rlm@2: (.getImage s2b) rlm@2: )) rlm@2: rlm@2: (defn glue-horizontal "Concatenate images in a sequence from left to right, producing a new image." [image & imgs] rlm@2: (let [imgs (cons image imgs) rlm@2: op (doto (IMOperation.) rlm@2: (.addImage (count imgs)) rlm@2: (.p_append) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object (vec imgs)))) rlm@2: (.getImage s2b) rlm@2: )) rlm@2: rlm@2: rlm@2: rlm@2: (defn resize "Resize the image, keeping the same aspect ratio." rlm@2: ([img width height] rlm@2: (let [op (doto (IMOperation.) rlm@2: (.addImage) rlm@2: (.resize width height) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object [img]))) rlm@2: (.getImage s2b) rlm@2: )) rlm@2: ( rlm@2: [img width] rlm@2: (resize img width nil) rlm@2: ) rlm@2: ) rlm@2: rlm@2: rlm@2: (defn upside-down "Flip the image upside down." rlm@2: [img] rlm@2: (let [op (doto (IMOperation.) rlm@2: (.addImage) rlm@2: (.flip) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object [img]))) rlm@2: (.getImage s2b) rlm@2: ) rlm@2: ) rlm@2: rlm@2: rlm@2: (defn scale-rotate-translate "Scale the image, then rotate the image about the axis coordinates, then translate the image by the given amount. Does not change the dimensions of the picture." rlm@2: ([img axis-x axis-y scale-x scale-y degrees translate-x translate-y] rlm@2: (let [arg-str (apply str (list axis-x "," axis-y " " scale-x "," scale-y " " degrees " " translate-x "," translate-y)) rlm@2: op (doto (IMOperation.) rlm@2: (.addImage) rlm@2: (.distort "ScaleRotateTranslate" arg-str) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object [img]))) rlm@2: (.getImage s2b))) rlm@2: ([img axis-x axis-y scale degrees translate-x translate-y] rlm@2: (recur axis-x axis-y scale scale degrees translate-x translate-y)) rlm@2: ) rlm@2: rlm@2: rlm@2: (defn rotate "Rotate the image clockwise by the given amount." [img degrees] rlm@2: (let [op (doto (IMOperation.) rlm@2: (.addImage) rlm@2: (.distort "ScaleRotateTranslate" (str degrees)) rlm@2: (.addImage (into-array String ["-"]))) rlm@2: s2b (Stream2BufferedImage.)] rlm@2: (doto (ConvertCmd.) rlm@2: (.setOutputConsumer s2b) rlm@2: (.run op (into-array Object [img]))) rlm@2: (.getImage s2b)) rlm@2: ) rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: rlm@2: (defn resize[] rlm@2: (let [op (doto (IMOperation.) rlm@2: (.addImage (into-array String ["/home/r/jiggly.gif"])) rlm@2: (.resize 800 600) rlm@2: (.addImage (into-array String ["/home/r/jiggly_sm.gif"])) rlm@2: )] rlm@2: (.run (ConvertCmd.) op (into-array Object [])))) rlm@2: rlm@2: rlm@2: (defn run-test[] rlm@2: (let [puff (read-image "/home/r/jiggly.gif")] rlm@2: (write-image (glue-horizontal puff puff puff) "/home/r/multijiggly.gif") rlm@2: ))