Создание эскизов в Java - PullRequest
       56

Создание эскизов в Java

3 голосов
/ 28 марта 2011

Я хочу создать миниатюры для группы изображений.для этого я использую следующий код:

public void run() {
        try{
    BufferedImage originalImage = ImageIO.read(new File(url));
    int type = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
            IMG_HEIGHT = (originalImage.getHeight()*600)/originalImage.getWidth();
    BufferedImage resizeImageJpg = resizeImage(originalImage, type);
    ImageIO.write(resizeImageJpg, "jpg", new File(thumb));
            originalImage.flush();
            resizeImageJpg.flush();
            System.gc();

}catch(IOException e){
    System.out.println(e.getMessage());
            System.out.println("Not Created:"+url);
}
    }
private static BufferedImage resizeImage(BufferedImage originalImage, int type){
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
g.dispose();
    System.gc();
return resizedImage;
}

Этот код работает нормально и создает эскизы.Но проблема в том, что при большом количестве изображений я получаю «ошибку пространства кучи Java». Это проблема с этим кодом?Как я могу решить эту проблему.Заранее спасибо.Если у вас есть другой код для изменения размера, пожалуйста, дайте мне.

Ответы [ 5 ]

3 голосов
/ 28 марта 2011

Попробуйте эту библиотеку масштабирования изображений, она отлично работает для меня.

http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/

1 голос
/ 28 марта 2011

Я не вижу, где вы устанавливаете IMG_WIDTH, может быть, это останется огромным значением.Вы должны предпочесть указывать целевую ширину и высоту в качестве параметров, так как способ установки высоты предотвращает многопоточное использование и делает его очень трудным для чтения.И я сомневаюсь, что высота целевого изображения действительно является частью состояния объекта.

Кроме того, вы уверены, что правильно устанавливаете высоту изображения, высота связана с соотношением между высотой и шириной, узкое изображение даст вам очень высокое изображение и растянутое изображение с учетом ширины целиизображение должно оставаться постоянным.

Последнее, http://www.jhlabs.com/ip/filters/index.html имеет некоторый полезный код для обработки изображения (включая изменение размера), я использовал их несколько раз.

Предполагая, что ваши изображения большие, вы можете захотеть взглянуть на JAI и использовать либо встроенные миниатюры, либо субдискретизацию, чтобы уменьшить необходимую память.

public static BufferedImage getThumb(ImageReader reader, int size) throws IOException {
    BufferedImage img;

    try {
        if (reader.getNumThumbnails(0) > 0) {
            img = reader.readThumbnail(0, 0);
        } else {
            ImageReadParam param = reader.getDefaultReadParam();
            param.setSourceSubsampling(4, 4, 0, 0);
            img = reader.read(0); //read(0, param);
        }
        throw new Exception();
    } catch (Throwable t) {
        img = null;
    }

    return img != null ? resizeImage(img, size) : null;
}   

public static BufferedImage getThumb(File file, double scale) throws IOException {
    BufferedImage img = null;

    try {
        Class<?> c = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.JAI");
        Class<?> ic = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.Interpolation");
        Class<?> sc = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.operator.ScaleDescriptor");
        Method jaiCreate = c.getMethod("create", String.class, Object.class);
        Method getInstance = findMethod(ic, "getInstance");
        Method sdCreate = findMethod(sc, "create");

        if (c != null) { 
            Object image = jaiCreate.invoke(null, "fileload", file.getAbsolutePath());              
            Object[] params = { image, (float) scale, (float) scale,
                    0.0f, 0.0f, getInstance.invoke(null, 2), null };
            Object sd = sdCreate.invoke(null, params);
            Method m = sd.getClass().getMethod("getAsBufferedImage");
            img = (BufferedImage) m.invoke(sd);
        }
    } catch (Throwable tt) {
        System.out.println("Could not read image using JAI, maybe JAI is not installed.");
        System.out.println(tt);
    }

    return img;
}
0 голосов
/ 26 октября 2011
0 голосов
/ 28 марта 2011

Создание миниатюр в Java требует соответствующего инструмента для этого: ImageMagick .

Позвоните с Java и наслаждайтесь результатами.Это всегда будет лучше, более отказоустойчиво и быстрее, чем все, что вы можете сделать в Java с доступными библиотеками.

0 голосов
/ 28 марта 2011

Как запустить этот процесс?Этот код, кажется, правильно очищает изображения.

Единственным вариантом является увеличение размера кучи путем добавления -Xmx 512m (например, для увеличения размера кучи до 512 МБ) в качестве одного из параметров командной строки VM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...