2010-02-06 5 views
1

Les images JPEG générées par ImageIO sont affichées correctement dans Windows Explorer, ainsi que dans Safari webbrowser, mais dans FireFox, les images rééchantillonnées sont tronquées.Les jpeg sont endommagés lors du rééchantillonnage avec java imageIO

Comment utiliser ImageIO sans corrompre les rééchantillonnages? Le code doit redimensionner le rapport d'aspect de conservation d'image, ainsi que la compression jpeg, la convertir en un tableau byte [], qui pourrait être écrit sur un socket.

une partie de mon code. dans cet extrait, j'ai essayé d'ajouter la bibliothèque Jui, mais toujours le même problème.

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(); 

Répondre

1

Je l'ai utilisé avec succès:

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

transformation est en train d'écrire simplement le contenu de l'image à une nouvelle BufferedImage

Questions connexes