3

私は clojure の初心者です (Java について何も知りません)。

私の目標は、URL から画像を取得し、そのサムネイルを作成することです。私はこれまでのところこれを持っています:

(ns myapp.image
  (:require [clojure.java.io :as io])
  (:import  [javax.imageio.ImageIO]
            [java.awt.image.BufferedImage]))

(defn get-remote-image
  [url file]
  (with-open [in (io/input-stream url) out (io/output-stream file)]
    (io/copy in out)))

(defn resize
  "Resize a file.  Pass in a width and height."
  [file-in file-out width height]
  (let [img     (javax.imageio.ImageIO/read (io/file file-in))
        imgtype (java.awt.image.BufferedImage/TYPE_INT_ARGB)
        simg    (java.awt.image.BufferedImage. width height imgtype)
        g       (.createGraphics simg)]
    (.drawImage g img 0 0 width height nil)
    (.dispose g)
    (javax.imageio.ImageIO/write simg "png" (io/file file-out))))

現在、URLから画像を取得し、ディスクに書き込み、バッファからバッファに書き込みます。次に、ディスクから読み取り、メモリ内のイメージのサイズを変更して、新しいファイルに再度書き込みます。最後に、最初のコピーを削除できます。

一時的なディスク書き込みなしで、操作全体を 1 回のパスで実行したいと考えています。画像全体をメモリに保持することは特に気にしません...私の目的では、それらは一般的に小さめの画像になります。

java.awt.image.BufferedImageio ストリームからオブジェクトにデータを渡す方法がわかりません。

4

2 に答える 2

6

便利な新しいライブラリImagezを作成しました。これにはscale-image、画像のスケーリングに関して必要なことを正確に実行する関数があります。

(use 'mikera.image.core)

;; scale an image into a thumbnail of a given size
(def thumbnail (scale-image some-buffered-image new-width new-height))

必要に応じて (テストなどで) ファイルシステムに依存せずにメモリ内ですべてを実行できるように、画像処理操作を IO 関数とは別にしておくことをお勧めします。

于 2013-05-15T09:09:53.103 に答える
2

パラメータとして受け取るreadメソッドをImageIO使用して、オブジェクトを返します。URLBufferedImage

于 2013-05-09T04:27:29.920 に答える