品質を維持しながら大規模な画像のダウンサイズを行う
画像を過度にダウンサイズすると、品質に問題が生じる可能性があります。これに対処するには、分割統治が効果的な方法です。方法は次のとおりです:
1.元の画像:
2.増分ダウンサイズ:
1 ステップで 300x300 から 60x60 にサイズ変更するのではなく、段階的にスケールします:
各ステップで画像の寸法が次のように縮小されます。半分。
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 サイトの他の関連記事を参照してください。