Определение того, содержит ли BufferedImage прозрачные пиксели

Я пытаюсь оптимизировать механизм рендеринга в Java, чтобы он не рисовал объекты, которые закрыты «сплошными» дочерними объектами, нарисованными перед ними, т.е. родитель закрыт своими дочерними элементами.

Я хочу знать, содержит ли произвольное BufferedImage, которое я загружаю из файла, какие-либо прозрачные пиксели, так как это влияет на мое тестирование окклюзии.

Я обнаружил, что могу использовать BufferedImage.getColorModel().hasAlpha(), чтобы узнать, поддерживает ли изображение альфа-канал, но в этом случае он не говорит мне, содержит ли оно определенно непрозрачные пиксели.

Я знаю, что могу перебрать данные пикселей и проверить альфа-значение каждого из них и вернуться, как только обнаружу непрозрачный пиксель, но мне было интересно, есть ли уже что-то нативное, что я мог бы использовать, возможно, флаг, установленный внутри? Или что-то менее интенсивное, чем перебор пикселей.

Любой вклад приветствуется, спасибо.


person Peter Flower    schedule 27.02.2014    source источник
comment
Уверен, вам нужно будет пройтись по каждому пикселю и проверить значение альфа-канала. Извиняюсь.   -  person wattostudios    schedule 27.02.2014


Ответы (2)


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

Если вам не нужно быть уверенным на 100%, вы, конечно, можете протестировать только некоторые пиксели, где, по вашему мнению, прозрачность будет наиболее вероятной.

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

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

Доступ к альфа-значениям в его «родном представлении» (через классы Raster/DataBuffer/SampleModel) будет быстрее, чем использование BufferedImage.getRGB(x, y) и маскирование альфа-значений.

person Harald K    schedule 27.02.2014

Я почти уверен, что вам нужно будет просмотреть каждый пиксель и проверить значение альфа-канала.

Лучшей альтернативой, которую я могу предложить, является написание специального метода для чтения данных пикселей, т.е. вашего собственного Raster. В этом классе, когда вы читаете данные пикселей из исходного файла в буфер данных, вы можете проверять альфа-значения по ходу дела. Конечно, это не очень поможет, если вы используете встроенный класс чтения изображений, и требует гораздо больше усилий.

person wattostudios    schedule 27.02.2014