使用ImageIO.read()时颜色发生变化

时间:2014-05-17 13:02:01

标签: java image swing javax.imageio

我正在尝试从外部目录中读取图像,并且我正在使用

               bufferedImage image=ImageIO.read(new File(imagefile));
               jlabel.seticon(new imageicon(image));

并且颜色发生了巨大变化。我尝试过很多其他的事情:

               bufferedImage image=ImageIO.read(new File(imagefile));
               bufferedImage img=new bufferedImage(image.getWidth(),image.getHeight(),bufferedImage.TYPE_INT_RGB);

我试过了:

               img.setData(image.getData();
               jlabel.seticon(new imageicon(image));

我试过了:

Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
ImageReader reader = null;
while(readers.hasNext()) {
    reader = (ImageReader)readers.next();
    if(reader.canReadRaster()) {
        break;  
         }
        }
ImageInputStream input =   ImageIO.createImageInputStream(f); 
reader.setInput(input); 
Raster raster = reader.readRaster(0, null); 
BufferedImage bi = new BufferedImage(raster.getWidth(), raster.getHeight(), 
BufferedImage.TYPE_4BYTE_ABGR); 
bi.getRaster().setRect(raster);

但结果仍然相同 http://i.stack.imgur.com/jNVm0.jpg

以下是此问题的示例:

enter image description here

查看的最小代码是:

      bufferedImage image=ImageIO.read(new File(imagefile));
      jlabel.seticon(new imageicon(image));      
      lbitem.setIcon(im);

并存储

        File f = new File(s);
            long size=f.length();
            FileInputStream fis1=new FileInputStream(f);
            FileOutputStream fos2=new FileOutputStream("src/image/"+tfpn.getText()+".jpg");
            byte b[]=new byte[1000];
            int r=0;
            long count=0;
            while(true)
            {
                r=fis1.read(b,0,1000);
                fos2.write(b,0,1000);
                count = count+r;
                if(count==size)
                break;
                System.out.println(count);
            }

什么可能导致糟糕的颜色?

1 个答案:

答案 0 :(得分:1)

此问题是由于读取/写入(创建/使用)图像之间的不匹配造成的  包含alpha(透明度)但你期望它不包含alpha(或反向)。  例如,如果您的图像是BufferedImage.TYPE_4BYTE_ABGR并输出它  到不支持alpha(透明度)的文件类型,或者你的编写器没有  支持alpha,阅读并显示后,它看起来就像你的样本。

使用PNG类型(支持Alpha通道)而非JPG(不支持Alpha通道)