2012-08-20 10 views
6

Tworzę interfejs użytkownika za pomocą Swing i chcę wyświetlić obraz w postaci JLabel. Kod używam jest następujący:Toolkit.getDefaultToolkit(). CreateImage() kontra ImageIO.read()

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

Działa to dobrze, jeśli mogę użyć png obrazy, ale jeśli chodzi o jpg (tylko niektóre z nich), otrzymuję Redish obraz (inną niż jednego widzę w Paint.NET). Obraz użyłem jest to jedno: img.jpg

Więc próbowałem (alternatywnie):

Toolkit.getDefaultToolkit().createImage(new File("img.jpg").getAbsolutePath()); 
  1. Czy ktoś ma pomysł dlaczego tak się dzieje? Czy jest to specjalny format JPEG, który nie jest obsługiwany?
  2. Przeczytałem na tym forum, że większość osób zaleca używanie ImageIO (na przykład: here). Czemu?

dziękuję

+1

Czy alternatywa działa? – ShiDoiSi

+2

Tak, to prawda. Dlatego zastanawiam się, dlaczego ludzie polecają w inny sposób ... –

+1

Czekaj, nie mogę znaleźć 'createImage (File f)' w dokumentacji Toolkit Java ... na pewno? – ShiDoiSi

Odpowiedz

7

Jak omówiono here, obraz JPEG może zawierać informacje o przezroczystości. Jednym prostym sposobem jest renderowanie obrazu w buforze mającym zgodny model kolorów, jak pokazano na here.

+1

Zobacz także ['createCompatibleImage()'] (http://docs.oracle.com/javase/6/docs/api/ java/awt/GraphicsConfiguration.html). – trashgod

5

Wygląda na to, że znalazłeś błąd w ImageIO.read ... (mogę odtworzyć czerwony odcień, a to na pewno nie jest, jak to powinno wyglądać).

Można spróbować

  • zapisywać pliki JPEG z innymi ustawieniami
  • otwarty/ponowne zapisanie pliku z innymi programami (w nadziei, aby uzyskać więcej wspólnego JPEG kodowanie)
  • lub wykorzystanie metoda Toolkit (jeśli nie kontrolujesz obrazów).

Jedyny problem z metodą Toolkit jest to, że metoda GetImage() zwraca natychmiast po wywołaniu i ładowanie się dzieje na wątku tła, więc nie można od razu rozpocząć pracę z obiektem zdjęcia.