5

元の画像は次のとおりです: http://rank.my/public/images/uploaded/orig-4193395691714613396.png

そして、ここでは 300x225 に縮小されています。

http://rank.my/public/images/uploaded/norm-4193395691714613396.png

そして、ここでは 150x112 に縮小されています。

http://rank.my/public/images/uploaded/small-4193395691714613396.png

ご覧のとおり、300x225 は見た目が悪く、150x112 はひどく見えます。画像を縮小するために使用しているコードは次のとおりです。

private static BufferedImage createResizedCopy(final BufferedImage source, final int destWidth,
        final int destHeight) {
    final BufferedImage resized = new BufferedImage(destWidth, destHeight, source.getType());
    final Graphics2D bg = resized.createGraphics();
    bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    bg.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    final float sx = (float) destWidth / source.getWidth();
    final float sy = (float) destHeight / source.getHeight();
    bg.scale(sx, sy);
    bg.drawImage(source, 0, 0, null);
    bg.dispose();
    return resized;
}

ここで何が間違っていますか?画像のスケーリングは特に高速である必要はありません。速度よりも品質が優先されます。間違ったテクニックを使用していますか?

4

3 に答える 3

5

ダウンスケーリングの問題を修正するには、3 つの方法があります。1 つ目は、各ステップで 75% を超えないように、複数のステップで行うことです。2 つ目は、サイズ変更の前に画像をぼかすことです。縮小すればするほど、ぼかしが必要になります。3 番目の方法は、ナイーブ バイリニアまたはバイキュービック補間法で使用される 2x2 から 4x4 ピクセル ブロック以上を使用してフィルタリングする方法を使用することです。縮小係数が大きくなると、フィルタで使用されるピクセル ブロックも大きくなります。そうしないと、ここで見たようにエイリアシング アーティファクトが発生します。

于 2011-02-11T03:48:31.783 に答える
3

私はこれらのライブラリを使用したことがないので、答える資格がないと感じていますが、役立つと思われるこれらのリンクを伝えずにはいられません。うまくいけば、これは役に立ちます。

http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html

http://www.componenthouse.com/article-20

于 2011-02-11T02:33:50.803 に答える
2

JAIはかなりイライラします。どのような設定を行っても、ImageMagickの速度、品質、シンプルさに決して匹敵しないのはなぜなのか、今でも疑問に思っています。できる限り ImageMagick を使用することを好みます。

以下のコードは、画像のスケーリングに最適な結果をもたらすものです。RenderingHints.VALUE_RENDER_QUALITYand SubsampleAverageand not を使用していることに注意してくださいRenderingHints.VALUE_INTERPOLATION_BICUBIC

私は JAI 処理を小さなブロックにまとめ、常にそれを使用してスケールダウンしています。スケールアップすると、同じコードでは良い結果が得られません。別の設定が適用されます。私はPNGで試したことはありません.JPEGは私が扱ったものです.

お役に立てれば

//Set-up and load file
PlanarImage image = JAI.create("fileload", absPath);
RenderingHints quality = new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
Properties p = new Properties(System.getProperties());
p.put("com.sun.media.jai.disableMediaLib", "true");
System.setProperties(p);

//Setup the processes
ParameterBlock pb = new ParameterBlock()
    .addSource(image)
    .add(scaleX)     //scaleX = (double)1.0*finalX/origX
    .add(scaleY);    //scaleY = (double)1.0*finalY/origY
RenderedOp tempProcessingFile = JAI.create("SubsampleAverage", pb, quality);

//Save the file
FileOutputStream fout = new FileOutputStream(file);
JPEGEncodeParam encodeParam = new JPEGEncodeParam();
encodeParam.setQuality(0.92f); //My experience is anything below 0.92f gives bad result
ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", fout, encodeParam);
encoder.encode(tempProcessingFile.getAsBufferedImage());

また、私を助けた記事は次のとおりです。

(上記のリンクは私のブックマークからのものです。リンクが切れている場合は編集してください)

于 2011-02-11T04:43:39.003 に答える