views:

237

answers:

1

The JPEG Images that ImageIO generated view correctly on windows file explorer, as well as safari webbrowser, but in FireFox, the resampled images are clipped.

How do I use ImageIO without corrupting the resamples?

The code should resize image keeping aspect ratio, as well as do jpeg compression, the convert it to a byte [] array, which could be written to a socket.

some of my code. in this snippet, I tried adding Jui library, but still the same issue.

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  A: 

I've been successfully using:

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

transformation is simply writing the contents of the image to a new BufferedImage

Bozho