품질 보존을 통한 대규모 이미지 축소
이미지를 과도하게 축소하면 품질 문제가 발생할 수 있습니다. 이를 해결하기 위해서는 분할 정복이 효과적인 방법이다. 방법은 다음과 같습니다.
1. 원본 이미지:
2. 증분적 축소:
한 단계에서 300x300에서 60x60으로 크기를 조정하는 대신 점진적으로 크기 조정:
각 단계에서 이미지 크기가 다음과 같이 줄어듭니다. 반.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!