Альтернативные библиотеки для загрузки PNG изображений - PullRequest
3 голосов
/ 14 декабря 2010

Мое java-приложение J2SE читает много (png) изображений из Интернета, и некоторые из них используют такие функции, как цвет прозрачности для изображений с истинным цветом (раздел tRNS), которые просто игнорирует реализация PNGImageReader от Sun / Oracle. *

Поэтому общее решение для загрузки через ImageIO.read(...); не работает для меня, так как оно опирается на эту неполную реализацию PNGImageReader.

Кто-нибудь знает реализацию png-ридера, которая может правильно считывать все формы изображений PNG - те, которые имеют таблицу цветов или с истинным цветом и альфа-прозрачностью или прозрачным цветом?

Как и для проекта GPL, это должен быть некоммерческий проект, который может быть включен без проблем с лицензированием в приложение.

Редактировать: Возможно, этот вопрос был слишком конкретным. Поэтому давайте перепроектируем мой вопрос:

Кто знает альтернативные реализации и библиотеки, способные загружать файлы PNG?

Затем я протестирую реализации на их способность загружать некоторые test png изображений .

Edit2: Конечным результатом должен быть BufferedImage

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Наконец-то я нашел подходящий PNG-ридер, который идеально соответствует моим потребностям:

Sixlegs Java PNG Decoder

Основные характеристики:

  • Open Source (LGPL)
  • Загружает PNG правильно, включая альфа прозрачность и прозрачные цвета
  • Возвращает BufferedImage
  • Больше не зависит от других библиотеки
  • Имеет очень маленький размер (46 КБ для всей библиотеки).
2 голосов
/ 15 декабря 2010

Вы пробовали библиотеку Apache Commons Imaging ? Поддержка PNG указана как:

Поддерживается в версии 1.2 / ISO / IEC стандарт (15948: 2003). Контролировать точный формат при написании неполный.

Будучи чистой библиотекой Java, она должна хорошо работать на J2SE.

1 голос
/ 15 декабря 2010

Используйте следующее для получения изображения:

Toolkit.getDefaultToolkit().getImage(theFilenameOfTheImage)

Редактировать: Если вам нужен BufferedImage, вы можете использовать следующее:

ImageIcon iic=new ImageIcon(theFilenameOfTheImage);
BufferedImage bimg=((ToolkitImage)iic.getImage()).getBufferedImage();

Этов основном загружает изображение таким же образом, но класс ImageIcon использует MediaTracker, чтобы убедиться, что изображение полностью загружено.Таким образом, вы можете получить доступ к полученному BufferedImage, и оно всегда будет содержать растровое изображение.

...