> 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)

각 단계에서 이미지 크기가 다음과 같이 줄어듭니다. 반.

3. 결과:

여기에 이미지 설명을 입력하세요.

4. 비교(한 단계 vs. 분할 및 정복):

여기에 이미지 설명 입력

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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿