Сожмите JPG, чтобы изображение стало зеленым - PullRequest
5 голосов
/ 15 марта 2011

Когда я пытаюсь сжать изображение jpg, в большинстве случаев оно работает отлично, однако некоторые изображения jpg становятся зелеными после сжатия. Вот мой код

public void compressImage(String filename, String fileExtension) {
    BufferedImage img = null;
    try {
        File file = new File(filename);
        img = ImageIO.read(file);

        if (fileExtension.toLowerCase().equals(".png") || fileExtension.toLowerCase().equals(".gif")) {
            //Since there might be transparent pixel, if I dont do this,
            //the image will be all black.
            for (int x = 0; x < img.getWidth(); x++) {
                for (int y = 0; y < img.getHeight(); y++) {
                    int rgb = img.getRGB(x, y);
                    int alpha = (rgb >> 24) & 0xff;
                    if (alpha != 255) {
                        img.setRGB(x, y, -1); //set white
                    }
                }
            }
        }
        Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
        //Then, choose the first image writer available
        ImageWriter writer = (ImageWriter) iter.next();
        //instantiate an ImageWriteParam object with default compression options
        ImageWriteParam iwp = writer.getDefaultWriteParam();
        //Set the compression quality
        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        iwp.setCompressionQuality(0.8f);
        //delete the file. If I dont the file size will stay the same
        file.delete();
        ImageOutputStream output = ImageIO.createImageOutputStream(new File(filename));
        writer.setOutput(output);
        IIOImage image = new IIOImage(img, null, null);
        writer.write(null, image, iwp);
        writer.dispose();
    } catch (IOException ioe) {
        logger.log(Level.SEVERE, ioe.getMessage());
    }
}

Original Image Compress Image. Image turn green

Ответы [ 2 ]

0 голосов
/ 03 августа 2016

У меня такая же проблема. В моем тестовом сервере запустить Java 7 Oracle и работает нормально. На моем рабочем сервере запустите openJDK 1.7, и сжатые изображения станут зелеными ... Это кажется ошибкой в ​​некоторых версиях JAVA.

0 голосов
/ 06 апреля 2011

Из своего опыта я знаю, что зеленый - это цвет недавно отформатированной памяти YUV (в частности, YV12).Так что я думаю, что какой-то шаг не удался, и вы получаете информацию о яркости, но цветность не выполняется.Мне кажется, что он терпит неудачу, прежде чем доберется до самолета Cr.

В любом случае, удачи, это сложный вопрос.Хотя ваш код выглядит странно - что за странный специфичный для png код вверху?AFAIK, если вы используете .NET, вы можете в значительной степени относиться к любому зарегистрированному формату изображения так же, как к изображению без какой-либо забавной работы.

...