2

Imageを に変換したいBufferedImage。私は次のことを知っています:

Image tmp;
... //read, scale
BufferedImage buffered = new BufferedImage(SMALL_SIZE, SMALL_SIZE,
                BufferedImage.TYPE_INT_RGB);
buffered.getGraphics().drawImage(tmp, 0, 0, null);

しかし、それは本当に遅いです。BufferedImageピクセルの色データを取得する必要があるため、 が必要です。描画せずにそれを行う可能な方法を見つけました:

ToolkitImage ti = (ToolkitImage) tmp;
BufferedImage buffered = tmp.getBufferedImage();

しかし、それは常に を返しますnull。誰でもこれに対する解決策を提供できますか?

編集: より大きなタスク (この問題の原因) は次のとおりです: BufferedImage を最速かつ最も簡単な方法でスケーリングする

4

4 に答える 4

3

ToolkitImage から BufferedImage への同じ変換の問題がありました。

Graphics2D g2d = buffImage.createGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.dispose();

-- バッファリングされた画像に何も描画していませんでしたimage.getBufferedImage();null

を使用してImageIcon、元の の内部のものを初期化することができましたImage

ToolkitImage toolkitImage = (ToolkitImage) Toolkit.getDefaultToolkit().createImage("image.jpg");

Image temporary = new ImageIcon(toolkitImage).getImage();

BufferedImage buffImage = new BufferedImage(toolkitImage.getWidth(), toolkitImage.getHeight(),
        BufferedImage.TYPE_INT_ARGB);

Graphics2D g2d = buffImage.createGraphics();
g2d.drawImage(temporary, 0, 0, null);
g2d.dispose();

その後、buffImage には toolkitImage からのイメージが含まれていました。

于 2014-03-10T19:52:14.963 に答える
2

同じ問題がありました。いくつかの奇妙な理由で、ImageIcon を介して画像を取得することができました。そのため、byteArray(imageDate) を ImageIcon にロードし、ImageIcon から画像を読み取ったところ、正常に機能しました。

于 2013-12-04T08:39:11.253 に答える
1

JDKのみImageを使用するように変換するより高速な方法がわかりません。BufferedImage制限がない場合は、C または C++ でより高速なソリューションを作成し、JNI 経由でアクセスできるかもしれません。ImageMagick には、非常に高速で最適化されたルーチンがいくつかあるに違いありません。 編集: この回答には良い提案があります: https://stackoverflow.com/a/7726679/257299

別の戦略は、呼び出しを避けることImage Toolkit.getImage(URL)です。これには、への変換が必要BufferedImageです。代わりに、次を試してください。BufferedImage ImageIO.read(File)

BufferedImage ToolkitImage.getBufferedImage()常に返す理由についてnull

  1. ToolkitImagesunJDK パブリック API の一部とは見なされないパッケージの一部です。直接使用することは避けてください。Swing をコーディングすると、Sun が Swing で非公開クラスを大量に使用したため、このルールを破る人をよく見かけます。(SwingUtilitiesパッケージプライベートメソッドとクラスであらゆる種類の卑劣なことを行います。)
  2. バッファリングされたイメージがによって内部的に生成された場合、メソッドgetBufferedImage()は非参照を返します。最後の文をもう一度読んでください。重要な用語が生成されます。この方法は「無料」ではなく、内部データを. ほとんどの場合 (99%) は生成されていないため、戻り値はです。 JDK ソース リファレンスnullTookitImageBufferedImageBufferedImagenull
于 2013-08-08T15:28:46.220 に答える