2010-02-06 77 views
1

ImageIO在Windows文件资源管理器中正确生成的JPEG图像以及safari webbrowser,但在FireFox中,重新采样的图像被剪切。jpeg在使用java重新采样时损坏imageIO

如何在不破坏重采样的情况下使用ImageIO?

该代码应调整图像保持宽高比,以及做JPEG压缩,将其转换为可以写入套接字的byte []数组。

我的一些代码。在这个片段中,我尝试添加Jui库,但仍然是同样的问题。

public static BufferedImage imageistream; 

public void Resample(String child,double width,double height) throws Exception, InvalidFileStructureException, InvalidImageIndexException, UnsupportedTypeException, MissingParameterException, WrongParameterException 
{ 
    String imagePath = ""; 
    if(this.is_mac_unix == true) 
    { 
     imagePath = this.path+"/"+child; 
    } 
    else 
    { 
     imagePath = this.path+"\\"+child; 
    }  
     PixelImage bmp = null; 
     try { 
      bmp = ToolkitLoader.loadViaToolkitOrCodecs(imagePath, true, null);    
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Resample resample = new Resample(); 
     resample.setInputImage(bmp); 
     double fixedRatio = width/height; 

     if(((double)bmp.getWidth()/bmp.getHeight()) >= fixedRatio) 
     { 

     resample.setSize((int)width,(int)(bmp.getHeight()/(bmp.getWidth()/width))); 

     } 
     else 
     { 
      resample.setSize((int)width,(int)(bmp.getWidth()/(bmp.getHeight()/height)));  

     } 
     resample.setFilter(Resample.FILTER_TYPE_LANCZOS3); 
     resample.process(); 
     PixelImage scaledImage = resample.getOutputImage();   
     Processor.imageistream = ImageCreator.convertToAwtBufferedImage(scaledImage); 
     bmp = null;    
     Runtime rt = Runtime.getRuntime(); 
     rt.gc();       
} 


     ... 


     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 
     ImageIO.write(Processor.imageistream, "jpg", baos); 
        // ImageIO.write(Processor.imageistream, "png", baos); Works! 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    byte bytes[] = baos.toByteArray(); 

    ByteArrayInputStream is = new ByteArrayInputStream(bytes); 

     OutputStream os = (OutputStream)obj[1]; 
     OutputStreamWriter writer = (OutputStreamWriter)obj[0]; 

     byte[] buf= new byte[4096]; 
     int c; 

     try { 

     while (true) { 
    c= is.read(buf); 
    if (c<= 0) break; 
    os.write(buf, 0, c); 

     } 
     writer.close(); 
     os.close(); 
     is.close(); 

回答

1

我已经成功地使用:

BufferedImage bufferedImage = ImageIO.read(..); 
Image img = bufferedImage.getScaledInstance(..); 
BufferedImage result = // transform Image to BufferedImage 
ImageIO.write(result, "image/jpeg", response.getOutputStream()); 

变换,简单地写图像的内容到一个新的BufferedImage