ImageScaler принцип работы. Как влиять на качество сжатия картинок?

140
11 августа 2019, 17:10

Объясните пожалуйста принцип работы данного класса, а то немного не понимаю. И как влиять на качество сжатия картинок?

  public class ImageScaler {
        private ImageIcon originalImage;
        private ImageIcon scaledImage;
        public ImageIcon getOriginalImage() {
            return originalImage;
        }
        public ImageIcon getScaledImage() {
            return scaledImage;
        }
        public ImageScaler(Image image) {
                this.originalImage = new ImageIcon(image);
        }
        public void createScaledImage(int size, ScalingDirection scalingDirection) {
                if (scalingDirection == ScalingDirection.HORIZONTAL) {
                        scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(size, -1, Image.SCALE_SMOOTH));
                } else {
                        scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(-1, size, Image.SCALE_SMOOTH));
                }       
        }
        public void createScaledImage(int size, ScalingDirection scalingDirection, int scale) {
                if (scalingDirection == ScalingDirection.HORIZONTAL) {
                        scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(size, -1, scale));
                } else {
                        scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(-1, size, scale));
                }
        }
        public void createScaledImage(int width, int height, ScaleType scaleType) {
                int imageWidth = originalImage.getImage().getWidth(null);
                int imageHeight = originalImage.getImage().getHeight(null);
                double originalImageRatio = imageWidth / (double) imageHeight;
                double scaledImageRatio = width / (double) height;
                if(scaleType == ScaleType.FIT) {
                        if(imageHeight - (Math.abs(imageWidth - width) / originalImageRatio) <= height) {
                                scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(width, -1, Image.SCALE_SMOOTH));
                        } else if(imageWidth - (Math.abs(imageHeight - height) * originalImageRatio) <= width) {
                                scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(-1, height, Image.SCALE_SMOOTH));
                        }
                } else if(scaleType == ScaleType.FILL) {
                        if(imageHeight - (Math.abs(imageWidth - width) / originalImageRatio) >= height) {
                                scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(width, -1, Image.SCALE_SMOOTH));
                                int thumbHeight = scaledImage.getImage().getHeight(null);
                                // Crop the image
                                scaledImage = new ImageIcon(Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(scaledImage.getImage().getSource(), new CropImageFilter(0, (thumbHeight-height)/2, width, height))));
                        } else if(imageWidth - (Math.abs(imageHeight - height) * originalImageRatio) >= width) {
                                scaledImage = new ImageIcon(originalImage.getImage().getScaledInstance(-1, height, Image.SCALE_SMOOTH));
                                int thumbWidth = scaledImage.getImage().getWidth(null);
                                // Crop the image
                                scaledImage = new ImageIcon(Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(scaledImage.getImage().getSource(), new CropImageFilter((thumbWidth-width)/2, 0, width, height))));
                        }               
                }
        }
        // ENUMS
        public enum ScalingDirection {VERTICAL, HORIZONTAL};
        public enum ScaleType {FIT, FILL};
        public enum ImageType {
                IMAGE_JPEG ("jpeg"),
                IMAGE_JPG ("jpg"),
                IMAGE_PNG ("png");
                private String value = null;
                ImageType(String value) {
                        this.value = value;
                }
                String value() {
                        return value;
                }
        };
} 
Answer 1

А зачем так сложно, если можно просто? (не моё, взято на просторах stack overflow)

public class ImageConverter {
    public BufferedImage resize(BufferedImage image) {
        return resize(image, 100, 100);
    }
    public BufferedImage resize(BufferedImage image, int width, int height) {
        return resizeWithHint(image, width, height);
    }

    private BufferedImage resizeNormal(BufferedImage image, int width, int height) {
        int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
        BufferedImage resizedImage = new BufferedImage(width, height, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(image, 0, 0, width, height, null);
        g.dispose();
        return resizedImage;
    }
    private BufferedImage resizeWithHint(BufferedImage image, int width, int height) {
        int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
        BufferedImage resizedImage = new BufferedImage(width, height, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(image, 0, 0, width, height, null);
        g.dispose();    
        g.setComposite(AlphaComposite.Src);
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                           RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
                           RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                           RenderingHints.VALUE_ANTIALIAS_ON);
        return resizedImage;        
    }
}
READ ALSO
Рисование поверх превью камеры

Рисование поверх превью камеры

Хочу вывести превью камеры на дисплей и нарисовать квадрат в области тачаПревью получить удалось, но не могу грамотно реализовать отрисовку

97
Responsive clip-path

Responsive clip-path

В следующем примере блок main (синезелёный градиент) обрезается при помощи clip-path и принимает форму сердечкаОднако видно, что он обрезается...

113
flexbox, текст не переноситься во вложенном flexbox в ie11

flexbox, текст не переноситься во вложенном flexbox в ie11

В IE11 из-за вложенного флексбокса текст не переходит на следующую строку, а растягивается на весь контент, если же поставить дляitem width:100%, блоки...

74