В чем разница между способами чтения файла изображения в Java?

Существуют различные способы чтения файла изображения в Java, такие как BufferedImage а также ImageIcon назвать несколько. Я хочу знать, в чем разница между этими случаями? Являются ли они зависимыми от контекста, что в конкретном случае может использоваться только один из них?

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

2 ответа

Решение

Хорошим способом является использование различных методов ImageIO.read, которые возвращают объекты BufferedImage.

Image - это абстрактный класс, поэтому я думаю, что реальный вопрос в том, какой подкласс более эффективен для вашей программы. Используйте VolatileImage, если вам нужно аппаратное ускорение. Подробнее об этом здесь.

ImageIcon (а также Toolkit#createImage/Toolkit#getImage) использовать процесс фоновой загрузки. То есть после того, как вы вызовете эти методы, они сразу же вернутся, создав фоновый поток для фактической загрузки данных изображения.

Они использовались / используются при загрузке больших изображений через медленные соединения, как у старых модемов 28k (ах, как я помню дни). Это означает, что ваше приложение может продолжать работать, пока изображения загружены.

Вы найдете в Graphics класс drawImage методы принимают ImageObserver интерфейс и java.awt.Component реализует этот интерфейс, это позволяет компонентам автоматически обновлять себя после того, как образ фактически завершил загрузку.

ImageIO с другой стороны, не вернется, пока изображение не будет полностью загружено. Это также упрощает представление новых читателей / авторов, делая API гораздо более гибким, чем исходный API. ImageIO также поддерживает более широкий спектр изображений из коробки.

BufferedImage также является гораздо более гибким классом изображений, особенно когда речь идет о применении эффектов к изображению.

Теперь я лично предпочитаю ImageIO, Если я знаю, что загружаю большие изображения или изображения через потенциально медленное соединение, я создам свой собственный фоновый поток для их загрузки. В то время как немного более сложный, компромиссы значительно перевешивают небольшое количество дополнительной работы.

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

ImageIO без сомнения. Для того, чтобы делать какие-либо серьезные манипуляции с изображением, загруженным с помощью чего-либо ImageIconвам нужно будет преобразовать это изображение в BufferedImage тем не мение

Другие вопросы по тегам