Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 压缩JPG使图像变成绿色_Java_Compression_Jpeg_Javax.imageio_Image Compression - Fatal编程技术网

Java 压缩JPG使图像变成绿色

Java 压缩JPG使图像变成绿色,java,compression,jpeg,javax.imageio,image-compression,Java,Compression,Jpeg,Javax.imageio,Image Compression,当我尝试压缩jpg图像时,大多数情况下它工作得很好,但是一些jpg图像在压缩后变成绿色。这是我的密码 public void compressImage(String filename, String fileExtension) { BufferedImage img = null; try { File file = new File(filename); img = ImageIO.read(file); if (fileE

当我尝试压缩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());
    }
}
public void compressImage(字符串文件名、字符串文件扩展名){
BuffereImage img=null;
试一试{
文件=新文件(文件名);
img=ImageIO.read(文件);
if(fileExtension.toLowerCase().equals(“.png”)| | fileExtension.toLowerCase().equals(“.gif”)){
//因为可能有透明像素,如果我不这样做,
//图像将全部为黑色。
对于(int x=0;x>24)和0xff;
如果(alpha!=255){
img.setRGB(x,y,-1);//设置为白色
}
}
}
}
迭代器iter=ImageIO.getImageWritersByFormatName(“jpg”);
//然后,选择第一个可用的图像编写器
ImageWriter=(ImageWriter)iter.next();
//使用默认压缩选项实例化ImageWriteParam对象
ImageWriteParam iwp=writer.getDefaultWriteParam();
//设置压缩质量
iwp.setCompressionMode(ImageWriteParam.MODE_显式);
iwp.设置压缩质量(0.8f);
//删除文件。如果我不删除,文件大小将保持不变
delete();
ImageOutputStream输出=ImageIO.createImageOutputStream(新文件(文件名));
writer.setOutput(输出);
IIOImage image=新IIOImage(img,null,null);
writer.write(null,image,iwp);
writer.dispose();
}捕获(ioe异常ioe){
logger.log(Level.SEVERE,ioe.getMessage());
}
}

根据经验,我知道绿色是新格式化的YUV内存(特别是YV12)的颜色。所以我猜某个步骤失败了,你得到了亮度信息,但是色度变差了。在我看来,它在到达Cr飞机之前就失败了


不管怎样,祝你好运,这是一个艰难的时刻。但是,您的代码看起来很奇怪——顶部奇怪的png特定代码是怎么回事?好吧,如果你使用的是.NET,你几乎可以把任何注册的图像格式当作没有任何有趣工作的图像来处理。

我也有同样的问题。在我的测试服务器中,运行Java7Oracle并运行良好。在我的生产服务器中,运行openJDK 1.7,压缩图像变成绿色…这似乎是某些JAVA版本中的错误。

出于好奇,为什么要将
ServletContext
传递给此方法?“它从来没有被使用过。@Matt:说得好,它来自我的旧代码。”。我输入了
ServletContext
试图找出
文件路径
,但随后我决定输入
文件路径
而不是标题。我只是在测试图像(顶部图像)上运行了代码,它不影响颜色。它确实被压缩了(246KB对453KB)。顺便说一句,你应该一般性地声明迭代器:
iterator iter=ImageIO.get…
,然后你不需要强制转换,你只需要写这个:
ImageWriter writer=iter.next()我刚刚在OSX10.6上的JRE 6上运行了代码-也没有问题。可能是吗?我在exif标记中看到的唯一区别是原始图像的JFIF版本是1.1,而处理后的图像的版本是1.2。这是Java,不是C#,因此OP没有使用.NET。