2

画像のスケーリングに問題があります。次のコードを使用して画像を拡大縮小すると、画像の下部または右側に線が表示されます。

double scale = 1;
if (scaleHeight >= scaleWidth) {
    scale = scaleWidth;
} else {
    scale = scaleHeight;
}
AffineTransform af = new AffineTransform();
af.scale(scale, scale);

AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
BufferedImage bufferedThumb = operation.filter(img, null);

元の画像

ここに画像の説明を入力

スケーリングされた画像

ここに画像の説明を入力

線が表示される理由を知っている人はいますか?

ありがとう!

編集:

完全なメソッド コードを追加しました。

public static final int SPINNER_MAX_WIDTH = 105;
public static final int SPINNER_MAX_HEIGHT = 70;

public void scaleImage(BufferedImage img, int maxWidth, int maxHeight, String fileName) {
    double scaleWidth = 1;
    double scaleHeight = 1;

    if (maxHeight != NOT_SET) {
        if (img.getHeight() > maxHeight) {
            scaleHeight = (double) maxHeight / (double) img.getHeight();
        }
    }

    if (maxWidth != NOT_SET) {
        if (img.getWidth() > maxWidth) {
            scaleWidth = (double) maxWidth / (double) img.getWidth();
        }
    }

    double scale = 1;

    if (scaleHeight >= scaleWidth) {
        scale = scaleWidth;
    } else {
        scale = scaleHeight;
    }

    AffineTransform af = new AffineTransform();
    af.scale(scale, scale);

    AffineTransformOp operation = new AffineTransformOp(af, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
    BufferedImage bufferedThumb = operation.filter(img, null);

    if (bufferedThumb != null) {
        File imageFile = new File(fileName);
        String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
        try {
            ImageIO.write(bufferedThumb, fileType, imageFile);
        } catch (IOException e) {
            logger.error("Failed to save scaled image: " + fileName + "\n" + e.getMessage());
        }
    }
}

メソッド呼び出しの maxWidth および maxHeight パラメーターは、SPINNER_MAX_* 定数に設定されます。

ありがとう!

4

1 に答える 1

1

残りのコードを教えていただけますか - を操作する方法を教えてくださいbufferedThumb。ファイルに保存するだけで問題ないはずです。

ImageIO.write(bufferedThumb, "PNG", new File("img.png"));

どのJavaバージョンを使用していますか?

編集:

あなたが試みることができるのは、次のように明示的に最終的な画像を構築することです:

BufferedImage bufferedThumb = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_ARGB);
operation.filter(img, bufferedThumb);

どのカラーモードが使用されているかを確認します。

あなたの問題は次のバグに関連していると思われます: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6725106

もう1つのことは、次のような別の補間タイプを使用することです。

AffineTransformOp.TYPE_BILINEAR

詳細については、 http ://www.dpreview.com/learn/?/key=interpolation をご覧ください。

于 2010-03-19T15:47:46.540 に答える