2009-12-03 2 views

ответ

1
var n:Number = 1/3; 
var matrix:Array = [n,n,n,0,0, 
        n,n,n,0,0, 
        n,n,n,0,0, 
        0,0,0,1,0]; 

var cmf:ColorMatrixFilter = new ColorMatrixFilter(matrix); 
bitmap.filters = [cmf]; 
+0

Является ли LopSae точно такой же, как у меня, кроме того, что он изменяет значения яркости? И почему я не могу комментировать ответ LopSae? Очень странно ... Для того, что каждое значение в матрице делает, см: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/filters/ColorMatrixFilter.html – alecmce

+0

@LopSae - Я новый для StackOverflow, не в полной мере разработал все его уникальные слова благодарности! ;) Разница, которую вы видите, может быть очень тонкой в ​​зависимости от исходного изображения. Если вы используете тестовое изображение с относительно яркими, жирными цветами, то разные значения будут иметь меньше видимого эффекта, чем изображение с более тонкими оттенками ... – alecmce

+0

Математика этого не слишком сложна ... для каждого пикселя , он примет красные, зеленые и синие компоненты цвета пикселя и умножит их на первый второй и третий элементы в матрице (в моем случае 1/3 в вашем случае 0,2,0,7,0,1), добавьте их вместе и положите этот результат как красное значение. Затем он принимает одни и те же компоненты цвета пикселя и умножает их на шестой, седьмой и восьмой элементы в матрице, а также устанавливает их как зеленые. Подобно синему с 11, 12 и 13-м. Это создает оттенки серого, потому что в результате части для красного, зеленого и синего одинаковы. – alecmce

1

В общем, при условии, что вы начинаете с RGB изображения, конвертировать его в HSI цветового пространства и использовать I (интенсивность).

1

Чтобы преобразовать изображение в оттенки серого, вам нужно выполнить итерацию по каждому пикселю в буфере изображения и усреднить компонент R, G и B в один объект, а затем дублировать его три раза, чтобы получить новый цвет. псевдо-код (при условии, 8bit цвет):

for each pixel in buffer: 
    pixel.rgb = ((pixel.red + pixel.green + pixel.blue)/3) * 0x010101; 

Я уверен, что вы можете сделать что-то с Adobe, PixelBender для достижения этой цели быстрее.

+0

В качестве альтернативы, интенсивность иногда определяется как максимум (R, G, B). – Dima

0

Применить фильтр, созданный с помощью этого метода к DisplayObject, который содержит изображение, которое требуется в черно-белом:

public static function createBlackAndWhiteFilter():ColorMatrixFilter { 
    var rLum:Number = 0.2225; 
    var gLum:Number = 0.7169; 
    var bLum:Number = 0.0606; 

    var bwMatrix:Array = [rLum, gLum, bLum, 0, 0, rLum, gLum, bLum, 0, 0, rLum, gLum, bLum, 0, 0, 0, 0, 0, 1, 0]; 
    return new ColorMatrixFilter(bwMatrix); 
}//createBlackAndWhiteFilter 
+0

Даже если я не понимаю его полностью, я попробую это! Но: Для чего стоят конкретные значения и почему в массиве требуется ровно 20 значений? Возможно, я не должен много просить и просто использовать его ...: -J – algro

+0

20 значений в массиве должны сделать матрицу 5x4, которая фактически почти такая же, как и те, что были отправлены в этом же вопросе alecmce, только что написано в строке. Различные значения связаны (насколько я знаю) с различной интенсивностью света каждого цвета компонента. Таким образом, вы уменьшаете интенсивность каждого цвета в разных измерениях, чтобы каждый стал оттенком серого. – LopSae

+0

@alecmce: Мы не можем комментировать ответы друг друга, потому что пока у нас еще нет репутации 50 (это ограничивает нас комментариями только для наших собственных ответов). И да, это в основном тот же ответ, который я выяснил недавно. Извини за это.То, что я нашел действительно запутанным, заключается в том, что использование вашей матрицы с 1/3, с 1, и моя матрица производит точно такой же эффект, никаких разных оттенков, никакой разной интенсивности ... так что фактическое значение действительно имеет значение для чего-то? – LopSae

Смежные вопросы