Откриване дали 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