2010-11-18 30 views
7

Java JAIで画像をスケーリングする必要があります。 ...Javaによる画像のスケーリングJAI

どれを

private static RenderedOp scale(RenderedOp image, float scale) { 
    ParameterBlock scaleParams = new ParameterBlock(); 
    scaleParams.addSource(image); 
    scaleParams.add(scale).add(scale).add(0.0f).add(0.0f); 
    scaleParams.add(Interpolation.getInstance(Interpolation.INTERP_BICUBIC_2)); 

    // Quality related hints when scaling the image 
    RenderingHints scalingHints = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
    scalingHints.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
    scalingHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    scalingHints.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
    scalingHints.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
    scalingHints.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); 
    scalingHints.put(JAI.KEY_BORDER_EXTENDER, BorderExtender.createInstance(BorderExtender.BORDER_COPY)); 

    return JAI.create("scale", scaleParams, scalingHints); 
} 

残念ながら、これは私が頻繁に0.5未満のスケールファクタで画像を拡大縮小する必要が特にあるため、非常に悪い結果につながる:今時点で、私は次のコードを使用します助言?

+0

この行が見えます疑似scaleParams.add(scale).add(scale).add(0.0f).add(0.0f); – whatnick

+0

あなたが悪いと意味するものを説明するためのいくつかのサンプル結果は、あなたが経験しているアーティファクトのタイプを特定するのにも役立ちます。 – whatnick

+0

「AffineTransformOp」を使用しない理由は何ですか?参照してくださいhttp://stackoverflow.com/questions/4216635 – trashgod

答えて

15

大きな画像をサムネイルサイズに縮小しようとしているか、元の画像と同じように大きな差異を縮小していると思いますか?

このトピックは、2007年のJava2DからChris Campbellによって実際にアドレスされました(これはよく知っているとは思っていませんが、それはよくある質問です)。新しいJava2Dスケーリングが近づいているためです。(RenderingHints.VALUE_INTERPOLATION_ *)は、非推奨のImage.getScaledInstance(SCALE_AREA_AVERAGING or SCALE_SMOOTH)アプローチと同等の機能を提供していませんでした。

古いJava 1.1 Image.getScaledInstanceアプローチのSCALE_AREA_AVERAGINGまたはSCALE_SMOOTHアプローチは、かなり高価な複数ステップの操作で、見栄えのよいイメージを生成するために多くの作業をバックグラウンドで実行していました。

クリスは、Java2Dを使用して同じ結果を得る新しい「正しい」方法が、望ましい画像サイズに達するまで、好ましくはより高い値を使用して画像を半分にスケ​​ーリングするインクリメンタルな処理であると指摘しましたRenderHints.VALUE_INTERPOLATION_BICUBICやBILINEARのような質の高いスケール。

結果は、元々Image.getScaledInstanceアプローチとほぼ同じです。

イメージホスティングサービスを作成しているときに、私は数ヶ月前にこの捜索のために実際に狩りに行きました。「Javaで見栄えのよいサムネイルを作成するにはどうすればいいですか?なりました。

私は最終的に、Chrisが提案したインクリメンタルアプローチを含む「ベストプラクティス」を使用して、Javaでイメージスケーリングの3つの異なるアプローチを実装する小さなJavaライブラリ(Apache 2、オープンソース)を作成します。

ライブラリはimgscalrと呼ばれます。設定および使用するためのより多くのオプション(スケーリングの例えば品質やスピード)がありますが、ボックスの外に素敵なを作るためにすべてのためのインテリジェントなデフォルト設定がある

BufferedImage thumbnail = Scalr.resize(srcImage, 150); 

:あなたはのように簡単にそれをダウンロードして使用することができますあなたのためにスケーリングされたイメージを探しています。そうしたくない場合は、もっと心配する必要はありません。また、ライブラリは、必ずしも必要ではないオブジェクトの割り当てを処分して回避するための強力な努力をしており、必要でない場合は即座にBufferedImageインスタンスを処分します。これは長時間実行するサーバアプリケーションの一部としてコード化することを意図しています。重要です。

私はすでにライブラリをいくつかリリースしていますが、「良いもの」を取り除き、何かを自分で行うのであれば、それを試してみてください。それはすべてGitHubにあり、そのどれもがトップシークレットではなく、単に人々の生活を楽にする試みです。

希望に役立ちます。

+0

このライブラリは非常に興味をそそられるようです。私は初期の例がうまくいきました。私たちはそれをまだ採用しておらず、今後の分析を続けています。 –

+0

@MichaelEasterそれを聞いてうれしいのはこれまでのところうまくいっています。追加のご意見をお待ちしております! –

3

私はThumbnailatorで良い結果を得ました。 JAI.KEY_BORDER_EXTENDERが何をすべきか分かりませんが、残りの機能(アンチエイリアス、ディザリングなど)はサポートされていると思います。 私はあなたが幸運であり、あなたが唯一のブラック&ホワイトイメージを持っている場合、あなたは非常に速く、良質の操作を使用することができ、非常に大きな黒と白の画像のグレースケールのサムネイルを生成する

関連する問題