Невозможно создать эскизы для больших файлов изображений - PullRequest
2 голосов
/ 25 апреля 2011

Я новичок в графике. Я использовал этот код для создания эскизов файлов изображений. Когда я использую небольшие файлы (~ 100 КБ), например, обои, он работает нормально, но когда я использую файл изображения (фотографию) размером ~ 5 МБ, он создает всего несколько байтов (~ 1-8 КБ) файла, который отображается как черное изображение. Неважно, какую ширину и высоту я ему даю. Что может быть не так? Это разница между типами изображений или камерой, которая производит изображения? Я уверен, что проблемные изображения с другой камеры, чем не проблемные. Я даю 100 качественных параметров, чтобы не пропустить ни одной детали таким образом ...

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

1 Ответ

2 голосов
/ 25 апреля 2011

Вы можете попробовать BufferedImage.TYPE_INT_ARGB, как показано здесь .

Кроме того, ваш MediaTracker ожидает в том же потоке;ImageIO.read() может быть проще.

Добавление: Также рассмотрите AffineTransformOp, хотя src и dst должны отличаться.

...