В ответ зэка в указывает, PNGJ отличается от BufferedImage
: это более низкий уровень, в том, что он не пытается изображать пиксели изображения в абстрактном общем формате (независимо от конкретного PNG формат), но вместо этого дает вам значения в формате, который отображается непосредственно в формате PNG и цветовой модели.
Это означает, что, например, если изображение PNG представляет собой RGB, вы получите три компонента RGB как прецедентные (целочисленные) значения. Если изображение PNG индексируется, вы получите индекс (целочисленное значение, указывающее на палитру). Если изображение PNG имеет серое значение, вы получите серое значение как одно целое число. И т. Д.
Если вы хотите обработать значения пикселей в более общем виде (дайте мне значения RGB, независимо от базовой цветовой модели), вы можете сделать преобразование самостоятельно или воспользоваться вспомогательными методами в ImageLineHelper класс. В частности, посмотрите на методы convert2rgba()
и getPixelARGB8()
.
Помните, что этот класс представляет собой всего лишь кучу вспомогательных методов, которые могут быть полезны для вас - или нет. Трудно полностью конвертировать в RGB, потому что есть много осложнений и эвристик - PNG позволяет несколько режимов прозрачности, глубины, цветовые пространства ... (что, если изображение имеет глубину 2 бита, что если это 16 бит? имеет нестандартный цветовой профиль или гамма-коррекцию, или он имеет единый блок прозрачности или ... и т. д.)? Если вы хотите поддерживать полный набор изображений PNG, почти необходимо понять базовый формат и сложности.
(Но, но ... BufferedImage
делает это с полной общностью, без двусмысленностей и без проблем, вы говорите? not exactly)
Если вы КИ с ограничением для вашей модели цвета (RGB, 8 бит, нет альфа) (и у вас нет прозрачности TRNS чанка или гамма особенности, или не волнует), то это не совсем просто:
for (int i = 0,j=0 ; i < reader.imgInfo.cols; i++, j+=channels) {
int r = scanLine[j];
int g = scanLine[j+1];
int b = scanLine[j+2];
// ...
}
Отказ от ответственности: Я PNGJ кодировщик.
Если я понимаю ваши комментарии к ответу @ FiReTiTi, ваш вопрос не в том, как использовать PNGJ, но более «Как я могу получить доступ к пикселям быстрее»? Если это так, вы можете сделать несколько действий, чтобы сделать «ImageIO.read» быстрее. Самый большой выигрыш обычно достигается с помощью 'ImageIO.setUseCache (false)'. – haraldK
Спасибо @haraldK Я пробовал код, который вы опубликовали, и вы правы, это быстрее. Около ~ 50 мс в виде разреза (по крайней мере, на моем тесте). Хотя PNGJ еще быстрее (~ 40 мс быстрее), чем ImageIO с setUseCache (false). Я преуспел в преобразовании ints, возвращаемых PNGJ. Я выложу это через некоторое время. –