PDA

Просмотр полной версии : Количество пикселей определенного цвета


Molecula
28.08.2007, 15:36
Добрый день.
Задача такая:
"Нужно узнать количество черных, серых и белых пикселей в подгружаемой картинке".

Как делаю:
Создаю Битмап, отрисовываю подгруженный мувик(куда загрузилась картинка), атачу в битмап, удалаяю оригинал - остается мув со сглаженной картинкой.
Через
getPixel
прохожусь по картинке.

В классе Битмапа не нашел другого метода, который бы возвращал значение пикселя

НО! Это ладно если она 100 на 100, в основном будут грузиться от 1250 на 1100 и выше, тогда комп просто виснет.
Получается, что он ему нужно проделать 1250*1100 итераций.

Как граммотно сделать подсчет пикселей определенного цвета?
Или подскажите где, копать (желательно АС2)

iNils
28.08.2007, 16:20
BitmapData.threshold

Molecula
28.08.2007, 16:46
Но BitmapData.threshold заменяет пиксели определенного цвета на другой, как же он сможет подсчитать сколько пикселей в картинке со значением "ffff00" ?

iNils
28.08.2007, 16:49
Так метод возращает число перекрашеных пикслей.

Molecula
28.08.2007, 16:52
Returns
Number - The number of pixels that were changed.
:eek:
Упс! Не внимательный был, проглядел.

Molecula
29.08.2007, 16:25
Да бы не создавать новую тему - продолжу тут.
Может тут соберется небольшая, но полезная кучка материала.

Что делаю вообще? - строю гистрограмму, как в фотопопе.
Когда-то просил помощи, линков...__etc дал пару инетересных урлов, хороших урлов, но увы, я делаю дополнительный модуль к проекту, который написали какие-то челы из Бобруйска.

iNils дал намек на
threshold
в Битмапдате, который возвращает кол-во замененных пикселей.

Дейсвительно, у меня получилось построить гистограмму - на 99% похожую как в Фотошопе.

Как делал.
Я беру в цикле от 1 до 256 каждый пиксель битмапы, которая есть градиент от черного до белого, после этого я применяю
threshold
к своей основной картинке (той, для которой я строю гистограмму) и заменаяю там пиксели - возвращая их количество.
Потом в мувике клонирую СТОЛБЕЦ (у него сейчас высота=1) и приравниваю к его высоте вот то кол-во замещенных пикселей.

Всё круто,...почти.
Получается, что я построил такую байду - ТОЛЬКО для монохромных изображений, я не учитывал остальные цвета.

Начал читать дальше.
Наткнулся на изречение, что "PaletteMap is fast" т.е. она работает быстрее threshold-а.

В хелпе сказано, что с помощью BitmapData.paletteMap method можно строить Уровни, я так понимаю, что те уровни, что и Ctrl+L in Photoshop.

Собственно, как Фотопоп строит уровни?
Я так понимаю, что он берет каждый канал, и пробиват от белого до черного для Красного, Синего, Зеленого - Яркость данного цвета и строит гистграммы, а потом совмещает их и строит общую.

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

Но перед тем, как брать пиксели я использовал
var matrix:Array = new Array();
matrix = matrix.concat([0, 0, 0, 0, 0]); // red
matrix = matrix.concat([0, 0, 0, 0, 0]); // green
matrix = matrix.concat([0, 0, 1, 0, 0]); // blue
matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha

var filter:BitmapFilter = new ColorMatrixFilter(matrix);
_bmp.filters = new Array(filter);

Т.е. я отображал в трех каналах изображание, делал копии (отрисовывал три) и по ним проходился по 255 раз :eek: ...мда..

BitmapData.paletteMap method - я так понял, что в массивах он хранит значения от самого яркого красного до самого темного красного, и так далее по остальным каналам или нет?