Ram
Ram

Reputation: 325

Unable to create thumbnails for large image files

I am a newbie to graphics. I've been using this code to make thumbnails of image files. When i use small files(~100KB) like wall papers, it works fine but when i use an image file(a photo) of size ~5MB, it produces just a few bytes(~1-8KB) of file which shows up as black image. It does not matter what Width and Height i give it. What could be going wrong here? Is it a difference between image types or the camera that produces the images? I'm sure the problem images are from a different camera than the non problematic ones. I am giving quality param as 100 to not miss out any detail that way...

        ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        int dx = thumbWidth, dy = thumbHeight; 

        Image image = Toolkit.getDefaultToolkit().createImage(file);
        MediaTracker mediaTracker = new MediaTracker(new Container());
        mediaTracker.addImage(image, 0);
        mediaTracker.waitForID(0);

        double thumbRatio = (double)thumbWidth / (double)thumbHeight;

        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);
        double imageRatio = (double)imageWidth / (double)imageHeight;

        if (thumbRatio < imageRatio) {
          thumbHeight = (int)(thumbWidth / imageRatio);
        } else {
          thumbWidth = (int)(thumbHeight * imageRatio);
        }

        if(thumbWidth > dx) {
            thumbWidth = dx;
            thumbHeight = (int)(thumbWidth / imageRatio);
        }
        if(thumbHeight > dy)
        {
            thumbHeight = dy;
            thumbWidth = (int) (thumbHeight*imageRatio);
        }

        log.debug("X="+thumbWidth+" Y="+thumbHeight);

        BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = thumbImage.createGraphics();
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null);

        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(thumbImage);

        quality = Math.max(0, Math.min(quality, 100));
        param.setQuality((float)quality / 100.0f, false);

        encoder.setJPEGEncodeParam(param);
        encoder.encode(thumbImage);
        log.debug("ThumbLength"+out.toByteArray().length);

        FileOutputStream fos = new FileOutputStream("/root/testx.jpg");
        fos.write(out.toByteArray());
        fos.close();

    } catch(Exception e) { log.debug(e.getMessage());}

    return out.toByteArray(); 

Upvotes: 2

Views: 820

Answers (1)

trashgod
trashgod

Reputation: 205775

You might try BufferedImage.TYPE_INT_ARGB, as shown here.

Also, your MediaTracker is waiting on the same thread; ImageIO.read() might be simpler.

Addendum: Also consider AffineTransformOp, although the src and dst must be different.

Upvotes: 2

Related Questions