Toolkit.getDefaultToolkit().createImage() против ImageIO.read()

Я создаю пользовательский интерфейс с помощью Swing и хочу отобразить изображение в формате JLabel. Я использую следующий код:

 JLabel label = new JLabel(new ImageIcon(ImageIO.read(new File("img.jpg"))));

Это прекрасно работает, если я использую изображения png, но когда дело доходит до jpg (только некоторые из них), я получаю красноватое изображение (отличное от того, которое я вижу в Paint.NET). Я использовал следующее изображение: img.jpg

Итак, я попробовал (в качестве альтернативы):

Toolkit.getDefaultToolkit().createImage(new File("img.jpg").getAbsolutePath());
  1. Кто-нибудь знает, почему это происходит? Это специальный формат JPEG, который не поддерживается?
  2. Я читал на этом форуме, что большинство людей рекомендуют использовать ImageIO (здесь например). Почему?

Большое спасибо


person Community    schedule 20.08.2012    source источник
comment
Да. Вот почему мне интересно, почему люди рекомендуют другой путь...   -  person    schedule 20.08.2012
comment
Подождите, я не могу найти createImage(File f) в документации Toolkit Java... да?   -  person Volker Stolz    schedule 20.08.2012
comment
Извините, я использую createImage(String path), я отредактировал вопрос...   -  person    schedule 20.08.2012


Ответы (2)


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

person trashgod    schedule 20.08.2012
comment
См. также createCompatibleImage(). - person trashgod; 20.08.2012

Похоже, вы нашли ошибку в ImageIO.read... (я могу воспроизвести красный оттенок, и это определенно не так, как должно выглядеть).

Вы можете попробовать

  • сохранить файлы JPEG с другими настройками
  • открыть/пересохранить файл другими программами (надеясь получить более распространенную JPEG-кодировку)
  • или используйте метод Toolkit (если вы не контролируете изображения).

Единственная проблема с методом Toolkit заключается в том, что метод getImage() возвращает значение сразу после его вызова, а загрузка происходит в фоновом потоке, поэтому вы не можете сразу начать работу с объектом Image.

person lbalazscs    schedule 20.08.2012