8

私はかなり経験豊富なJavaプログラマーですが、Java2Dには比較的慣れていません。画像を拡大縮小しようとしていますが、品質の悪い結果が得られています。画像はパネルのプレビューであるため、テキストやテキストフィールドなどが含まれています。私は常にスケールダウンしますが、アップすることはありません。

現在、私は次のコードを使用しています:-

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);

ここで、panelImageはフルサイズのプレビュー(BufferedImage)であり、scaledWidthとscaledHeightはそれぞれのターゲットディメンションです。テキストやテキストフィールドなどのエッジの詳細がかなり失われているようです。

画像を拡大縮小するために使用する必要があるより良い呼び出しはありますか?

ありがとう、ジョン

4

4 に答える 4

11

私ができる提案は、最初に画像のサイズを別のに変更することBufferedImageです。その理由は、より高品質のスケーリングされた画像を生成するために、のGraphics2DオブジェクトをBufferedImage取得できるためです。

Graphics2Dオブジェクトによる画像処理の実行方法を指示する「レンダリングヒント」を受け入れることができGraphics2Dます。このsetRenderingHintメソッドは、これらのレンダリングヒントを設定するために使用できるメソッドの1つです。クラスのレンダリングヒントをRenderingHints使用できます。

次に、そのGraphics2Dオブジェクトを使用しBufferedImageて、前に指定したレンダリングヒントを使用して画像を描画できます。

大まかな(テストされていない)コードは次のように機能します。

BufferedImage scaledImage = new BufferedImage(
    scaledWidth,
    scaledHeight,
    BufferedImage.TYPE_INT_RGB
);

Graphics2D g = scaledImage.createGraphics();
g.setRenderingHints(
    RenderingHints.Key.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BICUBIC
);

g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();

関心のある他のレンダリングのヒントには、次のものがあります。

Javaチュートリアルの「レンダリング品質の制御」セクションには、Graphics2Dオブジェクトのレンダリング品質を制御する方法に関する詳細情報もあります。

また、一般的なグラフィカルインターフェイスの扱いに関する非常に優れた情報源として、ChetHaaseとRomainGuyによるFilthyRichClientsを強くお勧めします。この本には、画像のスケーリングの問題を扱っているセクションが1つありますが、これは非常に関連性が高いようです。

于 2009-05-31T17:28:54.250 に答える
2

あなたが電話する必要があるかもしれません:

 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
于 2009-05-31T17:25:04.537 に答える
1

Coobird は、十分に小さいサムネイルで見栄えの良い結果を得るために、(できれば BICUBIC を使用して) 段階的に縮小する必要があることは正しいです。Image.getScaledInstance は AREA_AVERAGED アプローチでこれを行っていましたが、Chris Campbell が「Image.getScaledInstance() の危険性」記事で最初に提案した増分ダウンスケールよりもはるかに低速です。

ここで自己宣伝をして申し訳ありませんが、画像のスケーリングに関しては、いくつかの「ネイティブ Java のベスト プラクティス」をimgscarというライブラリにまとめました。

これは Apache 2 ライセンスの下で利用でき、ソースはすべて GitHub にあります。このライブラリの目標は、ネイティブ Java での画像のスケーリングを非常に簡単にし (1 つのクラス、5 つの静的メソッド)、最高の外観の結果 (これは当初望んでいたものです)、最速の結果 (大きな画像間でスケーリングする場合に最適) を保証することでした。 ) または 2 つのバランスを取り、ライブラリにどちらを使用するかを決定させます。

「画像のサイズを変更して邪魔にならないようにする」ことができるライブラリが欲しかったのですが、これらすべての投稿を数日間読んだ後、問題点(私自身も)に対処した後、戻って誰とでも作業を共有していました。そうでなければ役立つかもしれません。

于 2010-12-29T07:44:52.343 に答える
0

Coobirdは正しい考えを持っています。また、補間を試みRenderingHints.VALUE_INTERPOLATION_BILINEARて、見栄えが良いかどうかを確認します。ただし、バイキュービックはアップスケーリング時にうまく機能します。ダウンスケーリング時に最良の結果を得るには、いくつかのステップでダウンスケーリングする必要があります。最初に解像度を半分にし、次に半分にするというように、目的の解像度に近づくまで続けます (つまり、半分にできないか、画像が小さくなりすぎます)。最後のステップは、目的の解像度に縮小することです。

たとえば、入力画像が800x600で、 160x120に縮小するとします。

  1. 50%ダウンスケールします。--> 400x300
  2. 50%ダウンスケールします。--> 200x150
  3. 160x120に縮小します。
于 2009-05-31T17:53:23.197 に答える