Domanda

Le immagini JPEG che ImageIO generato avviso correttamente il file di Windows Explorer, così come safari browser web, ma in FireFox, le immagini ricampionate sono ritagliati.

Come si usa ImageIO senza corrompere i ricampiona?

Il codice deve ridimensionare un'immagine mantenendo proporzioni, così come fanno compressione JPEG, il convertito a un byte [] array, che può essere scritto una presa.

po 'del mio codice. in questo frammento, ho provato ad aggiungere biblioteca Jui, ma ancora lo stesso problema.

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();
È stato utile?

Soluzione

ho usato con successo:

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

trasformazione è semplicemente scrivendo il contenuto della immagine in un nuovo BufferedImage

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top