В чем разница между способами чтения файла изображения в 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
тем не мение