質問
私は合理的に経験豊富なJavaプログラマーですが、Java2Dにとっては比較的新しいです。画像を拡大しようとしていますが、質の悪い結果が得られています。画像はパネルのプレビューであるため、テキストやテキストフィールドなどが含まれています。私はいつもスケールダウンします、決して上がっていません。
現在、次のコードを使用しています。-
g.drawImage(panelImage, 0, 0, scaledWidth, scaledHeight, null);
パネルイメージはフルサイズのプレビュー(bufferedimage)であり、スケーリング幅とスケールハイトがそれぞれのターゲット寸法です。私はテキストやテキストフィールドなどのエッジで多くの詳細を失っているようです。
画像をスケーリングするために使用する必要があるより良い電話はありますか?
ありがとう、ジョン
解決
私ができる提案は、最初に画像を別のものにサイズ変更することです BufferedImage
. 。理由は、a 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
オブジェクト。
そして、一般的なグラフィカルなインターフェイスを扱うことに関する非常に良い情報源のために、 汚い金持ちのクライアント Chet HaaseとRomain Guyによって強くお勧めします。本には、画像のスケーリングの問題を扱うセクションが1つありますが、これは非常に関連性が高いと思われます。
他のヒント
あなたが電話するべきかもしれません:
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
と
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Coobirdは、十分なサムネイルのために見栄えの良い結果を得るために、漸進的にダウンスケール(できればBicubicを使用)する必要があることは正しいことです。 Image.getScaledInstanceはAREA_AVERAGEDアプローチでこれを行うために使用していましたが、「Image.getScaledInstance()」の記事でChris Campbellが提案した元のダウンスケールよりもはるかに遅いです。
ここで自己宣伝を許してくださいが、画像のスケーリングがライブラリにスケーリングされることになると、私は一握りの「ネイティブJavaのベストプラクティス」を丸めました。 imgscalr.
Apache 2ライセンスの下で利用でき、ソースはすべてGitHubにあります。ライブラリの目標は、ネイティブのJava Dead-Easy(1クラス、5つの静的な方法)で画像スケーリングを行い、最適な結果を確保することでした(これは元々望んでいたものです)、最速の結果(大きな画像間でスケーリングするときに最適です)または2つのバランスをとって、ライブラリに使用するものを決定させます。
「自分のイメージをサイズ変更して邪魔をする」ことができるlibが欲しかっただけで、これらの投稿をすべて読んだ後、ペインポイント(自分のものも)に取り組んでいたので、誰でも仕事を共有していましたそうでなければそれは助けになるかもしれません。
Coobird 正しい考えがあります。私も試してみます RenderingHints.VALUE_INTERPOLATION_BILINEAR
補間とそれが見栄えが良いかどうかを確認します。ただし、上昇時には双子はよりよく機能します。ダウンスケーリングの最良の結果を得るには、必要です いくつかのステップでのダウンスケール. 。最初に解像度を半分にし、次に再び半分になります。つまり、希望する解像度に近づくまで(つまり、半分になるか、画像が小さくなりすぎます)。最後のステップは、目的の解像度に縮小することです。
たとえば、入力画像は 800x600 そして、あなたはダウンスケールを望んでいます 160x120:
- ダウンスケール 50%. --> 400x300
- ダウンスケール 50%. --> 200x150
- ダウンスケール 160x120.