首頁 > Java > java教程 > 大幅縮小大影像時如何保持影像品質?

大幅縮小大影像時如何保持影像品質?

Barbara Streisand
發布: 2024-12-28 14:38:35
原創
695 人瀏覽過

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

在保持品質的情況下大規模縮小影像

過度縮小影像可能會帶來品質挑戰。為了解決這個問題,分而治之是一種有效的方法。方法如下:

1.原圖:

大幅縮小大影像時如何保持影像品質?

2.增量縮小:

不是一步從300x300 調整到60x60,而是逐漸縮放:

  1. 調整到150x150(原始尺寸的1/ 2)
  2. 調整大小至75x75(1/2 150x150)
  3. 調整大小為37x38 (75x75 的1/2)
  4. 調整大小為60x60 (37x38 的1/2)
  5. 調整大小為60x60 (37x38 的1/2)

每一步都會減少影像尺寸一半。

3。結果:

大幅縮小大影像時如何保持影像品質?

4。比較(一步與分治之):

大幅縮小大影像時如何保持影像品質?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板