Java2D миниатюры. Могу ли я получить эскиз от ОС - PullRequest
2 голосов
/ 15 ноября 2010

Я разрабатываю приложение, в котором я хочу отобразить сетку со списком изображений.Для каждого изображения я создаю экземпляр класса myImage.Класс MyImage, расширяет JCompoment и создает миниатюру, а после ее отрисовки переопределяет thepaintCompoment (Graphics g).

Все в порядке, но на изображениях большого размера у меня много задержек при создании эскиза.

Теперь я думаю, что когда я сканирую папки для изображения (чтобы создать список, который я сказал выше, чтобы создать миниатюру каждого изображения и сохранить его на диск. Для каждого изображения у меня будет запись базы данных, чтобы сохранить путь к изображению иthumbnail path.Так это хорошее решение проблемы? Есть ли способ получить миниатюры, создаваемые системой для каждого изображения, в файловом менеджере. Или более эффективное решение, чем я пытаюсь.

Спасибо!!

Ответы [ 3 ]

2 голосов
/ 15 ноября 2010

Лучше всего использовать что-то вроде imagemagick для преобразования изображения и создания эскиза.Есть проект под названием JMagick , который предоставляет JNI-хуки в Imagemagick, но также выполняет процессную работу.

Imagemagick - сильно оптимизированный C-код для работы с изображениями.Он также сможет обрабатывать изображения, которые не поддерживаются Java, и с гораздо меньшим использованием памяти.

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

Ниже приведен код Groovy, но он может быть легко изменен на код Java:

public boolean createThumbnail(InputStream input, OutputStream output){        

    def cmd = "convert -colorspace RGB -auto-orient -thumbnail 125x125 -[0] jpg:-"

    Process p = cmd.execute()
    p.consumeProcessErrorStream(System.out)
    p.consumeProcessOutputStream(output)
    p.out << input
    p.out.close()

    p.waitForOrKill(8000)
    return p.exitValue()==0
}

Это создает миниатюру с использованием каналов без фактической записи данных.на диск.OutputStream может быть в файле, если вы хотите сразу же записать его.

1 голос
/ 15 ноября 2010

Один из способов избежать зависимости от ОС - использовать getScaledInstance(), как показано в этом примере .См. цитируемые статьи для определенных ограничений.Если это занимает слишком много времени, используйте SwingWorker для загрузки и масштабирования в фоновом режиме.

0 голосов
/ 16 ноября 2010

Я не использовал его для создания миниатюр, но вы также можете взглянуть на API ImageIO.

ImageIO

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