ホームページ > Java > &#&チュートリアル > 大きな画像を大幅に縮小する場合、画質を維持するにはどうすればよいですか?

大きな画像を大幅に縮小する場合、画質を維持するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-28 14:38:35
オリジナル
695 人が閲覧しました

How can I preserve image quality when downsizing large images significantly?

品質を維持しながら大規模な画像のダウンサイズを行う

画像を過度にダウンサイズすると、品質に問題が生じる可能性があります。これに対処するには、分割統治が効果的な方法です。方法は次のとおりです:

1.元の画像:

大きな画像を大幅に縮小する場合、画質を維持するにはどうすればよいですか?

2.増分ダウンサイズ:

1 ステップで 300x300 から 60x60 にサイズ変更するのではなく、段階的にスケールします:

  1. 150x150 (元の寸法の 1/2) にサイズ変更します
  2. 75x75 (1/2) にサイズ変更します。 150x150)
  3. 37x38 (75x75 の 1/2) にサイズ変更します
  4. 60x60 (37x38 の 1/2) にサイズ変更します

各ステップで画像の寸法が次のように縮小されます。半分。

3.結果:

ここに画像の説明を入力してください

4.比較 (One Step と Divide and Conquer):

ここに画像の説明を入力してください

5. Java 実装:
public class DivideAndConquerImageResizer {

    public static main(String[] args) {
        // Load the original image
        BufferedImage original = ImageIO.read(...);

        // Create a scaled image
        BufferedImage scaled = null;

        Dimension currentSize = new Dimension(original.getWidth(), original.getHeight());
        Dimension desiredSize = new Dimension(60, 60);

        while (currentSize.getWidth() > desiredSize.getWidth()
               || currentSize.getHeight() > desiredSize.getHeight()) {
            // Halve the current size
            currentSize.width = (int) Math.ceil(currentSize.width / 2.0);
            currentSize.height = (int) Math.ceil(currentSize.height / 2.0);

            // Resize the image to the current size
            scaled = getScaledInstanceToFit(original, currentSize);
        }

        // Save the scaled image
        ImageIO.write(scaled, "jpg", ...);
    }

    public static BufferedImage getScaledInstanceToFit(BufferedImage img, Dimension size) {
        float scaleFactor = getScaleFactorToFit(img, size);
        return getScaledInstance(img, scaleFactor);
    }

    public static float getScaleFactorToFit(BufferedImage img, Dimension size) {
        float scale = 1f;
        if (img != null) {
            int imageWidth = img.getWidth();
            int imageHeight = img.getHeight();
            scale = getScaleFactorToFit(new Dimension(imageWidth, imageHeight), size);
        }
        return scale;
    }

    public static float getScaleFactorToFit(Dimension original, Dimension toFit) {
        float scale = 1f;
        if (original != null && toFit != null) {
            float dScaleWidth = getScaleFactor(original.width, toFit.width);
            float dScaleHeight = getScaleFactor(original.height, toFit.height);
            scale = Math.min(dScaleHeight, dScaleWidth);
        }
        return scale;
    }

    public static float getScaleFactor(int iMasterSize, int iTargetSize) {
        float scale = 1;
        if (iMasterSize > iTargetSize) {
            scale = (float) iTargetSize / (float) iMasterSize;
        } else {
            scale = (float) iTargetSize / (float) iMasterSize;
        }
        return scale;
    }

    public static BufferedImage getScaledInstance(BufferedImage img, double dScaleFactor) {
        BufferedImage imgBuffer = null;
        imgBuffer = getScaledInstance(img, dScaleFactor, RenderingHints.VALUE_INTERPOLATION_BILINEAR, true);
        return imgBuffer;
    }

}
ログイン後にコピー

このアプローチにより、特にサイズを大幅にダウンした場合に、画質が著しく向上します。

以上が大きな画像を大幅に縮小する場合、画質を維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート