?? colormatrix.as
字號:
?import flash.filters.ColorMatrixFilter;
import pssclasses.ColorsClass.*;
class ColorMatrix {
// RGB to Luminance conversion constants as found on
// Charles A. Poynton's colorspace-faq:
// http://www.faqs.org/faqs/graphics/colorspace-faq/
private var r_lum:Number = 0.212671;
private var g_lum:Number = 0.715160;
private var b_lum:Number = 0.072169;
/*
// There seem different standards for converting RGB
// values to Luminance. This is the one by Paul Haeberli:
private var r_lum:Number = 0.3086;
private var g_lum:Number = 0.6094;
private var b_lum:Number = 0.0820;
*/
private var IDENTITY:Array = Array(1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0);
public var matrix:Array;
function ColorMatrix(mat:Object) {
if (mat instanceof ColorMatrix) {
matrix = mat.matrix.concat();
} else if (mat instanceof Array) {
matrix = mat.concat();
} else {
reset();
}
}
/*
Function: reset
resets the matrix to the neutral identity matrix. Applying this
matrix to an image will not make any changes to it.
Parameters:
none
Returns:
nothing
*/
public function reset():Void {
matrix = IDENTITY.concat();
}
public function clone():ColorMatrix {
return new ColorMatrix(matrix);
}
/*
Function: adjustSaturation
changes the saturation
Parameters:
s - typical values come in the range 0.0 ... 2.0 where
0.0 means 0% Saturation
0.5 means 50% Saturation
1.0 is 100% Saturation (aka no change)
2.0 is 200% Saturation
Other values outside of this range are possible
-1.0 will invert the hue but keep the luminance
Returns:
nothing
*/
public function adjustSaturation(sV:Number):Void {
var s:Number = sV/100;
var is:Number = 1-s;
var irlum:Number = is*r_lum;
var iglum:Number = is*g_lum;
var iblum:Number = is*b_lum;
var mat:Array = Array(irlum+s, iglum, iblum, 0, 0, irlum, iglum+s, iblum, 0, 0, irlum, iglum, iblum+s, 0, 0, 0, 0, 0, 1, 0);
concat(mat);
}
public function adjustContrast(rV:Number, g:Number, b:Number):Void {
var r:Number = rV/100;
g = g || r;
b = b || r;
r += 1;
g += 1;
b += 1;
var mat:Array = Array(r, 0, 0, 0, 128*(1-r), 0, g, 0, 0, 128*(1-g), 0, 0, b, 0, 128*(1-b), 0, 0, 0, 1, 0);
concat(mat);
}
public function adjustBrightness(rV:Number, g:Number, b:Number):Void {
var r:Number = 255*rV/100;
g = g || r;
b = b || r;
var mat:Array = Array(1, 0, 0, 0, r, 0, 1, 0, 0, g, 0, 0, 1, 0, b, 0, 0, 0, 1, 0);
concat(mat);
}
public function adjustHue(angle:Number):Void {
angle *= Math.PI/180;
var c:Number = Math.cos(angle);
var s:Number = Math.sin(angle);
var f1:Number = 0.213;
var f2:Number = 0.715;
var f3:Number = 0.072;
var mat:Array = Array((f1+(c*(1-f1)))+(s*(-f1)), (f2+(c*(-f2)))+(s*(-f2)), (f3+(c*(-f3)))+(s*(1-f3)), 0, 0, (f1+(c*(-f1)))+(s*0.143), (f2+(c*(1-f2)))+(s*0.14), (f3+(c*(-f3)))+(s*-0.283), 0, 0, (f1+(c*(-f1)))+(s*(-(1-f1))), (f2+(c*(-f2)))+(s*f2), (f3+(c*(1-f3)))+(s*f3), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1);
concat(mat);
}
public function colorize(rgb:Number, amount:Number):Void {
var r:Number = ((rgb >> 16) & 0xff)/255;
var g:Number = ((rgb >> 8) & 0xff)/255;
var b:Number = (rgb & 0xff)/255;
if (amount == null) {
amount = 1;
}
var inv_amount:Number = 1-amount;
var mat:Array = Array(inv_amount+amount*r*r_lum, amount*r*g_lum, amount*r*b_lum, 0, 0, amount*g*r_lum, inv_amount+amount*g*g_lum, amount*g*b_lum, 0, 0, amount*b*r_lum, amount*b*g_lum, inv_amount+amount*b*b_lum, 0, 0, 0, 0, 0, 1, 0);
concat(mat);
}
public function setAlpha(aV:Number):Void {
var alpha:Number = aV/100;
var mat:Array = Array(1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, alpha, 0);
concat(mat);
}
public function desaturate():Void {
var mat:Array = Array(r_lum, g_lum, b_lum, 0, 0, r_lum, g_lum, b_lum, 0, 0, r_lum, g_lum, b_lum, 0, 0, 0, 0, 0, 1, 0);
concat(mat);
}
public function invert():Void {
var mat:Array = Array(-1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1, 0);
concat(mat);
}
public function threshold(t:Number):Void {
var mat:Array = Array(r_lum*256, g_lum*256, b_lum*256, 0, -256*t, r_lum*256, g_lum*256, b_lum*256, 0, -256*t, r_lum*256, g_lum*256, b_lum*256, 0, -256*t, 0, 0, 0, 1, 0);
concat(mat);
}
public function randomize(amount:Number):Void {
if (amount == null) {
amount = 1;
}
var inv_amount:Number = 1-amount;
var r1:Number = inv_amount+amount*(Math.random()-Math.random());
var g1:Number = amount*(Math.random()-Math.random());
var b1:Number = amount*(Math.random()-Math.random());
var o1:Number = amount*255*(Math.random()-Math.random());
var r2:Number = amount*(Math.random()-Math.random());
var g2:Number = inv_amount+amount*(Math.random()-Math.random());
var b2:Number = amount*(Math.random()-Math.random());
var o2:Number = amount*255*(Math.random()-Math.random());
var r3:Number = amount*(Math.random()-Math.random());
var g3:Number = amount*(Math.random()-Math.random());
var b3:Number = inv_amount+amount*(Math.random()-Math.random());
var o3:Number = amount*255*(Math.random()-Math.random());
var mat:Array = Array(r1, g1, b1, 0, o1, r2, g2, b2, 0, o2, r3, g3, b3, 0, o3, 0, 0, 0, 1, 0);
concat(mat);
}
public function setChannels(r:Number, g:Number, b:Number, a:Number):Void {
/*
var grid:Array=Array();
for (var y:Number=0;y<4;y++){
for (var x:Number=0;x<4;x++){
var n=grid.push(this["cb_"+y+""+x]);
grid[n-1].addEventListener("click",this);
}
}
var cr:Number = (grid[0].selected ? 1:0) | (grid[1].selected ? 2:0) | (grid[2].selected ? 4:0) | (grid[3].selected ? 8:0);
var cg:Number = (grid[4].selected ? 1:0) | (grid[5].selected ? 2:0) | (grid[6].selected ? 4:0) | (grid[7].selected ? 8:0);
var cb:Number = (grid[8].selected ? 1:0) | (grid[9].selected ? 2:0) | (grid[10].selected ? 4:0) | (grid[11].selected ? 8:0);
var ca:Number = (grid[12].selected ? 1:0) | (grid[13].selected ? 2:0) | (grid[14].selected ? 4:0) | (grid[15].selected ? 8:0);
*/
var rf:Number = ((r & 1) == 1 ? 1 : 0)+((r & 2) == 2 ? 1 : 0)+((r & 4) == 4 ? 1 : 0)+((r & 8) == 8 ? 1 : 0);
if (rf>0) {
rf = 1/rf;
}
var gf:Number = ((g & 1) == 1 ? 1 : 0)+((g & 2) == 2 ? 1 : 0)+((g & 4) == 4 ? 1 : 0)+((g & 8) == 8 ? 1 : 0);
if (gf>0) {
gf = 1/gf;
}
var bf:Number = ((b & 1) == 1 ? 1 : 0)+((b & 2) == 2 ? 1 : 0)+((b & 4) == 4 ? 1 : 0)+((b & 8) == 8 ? 1 : 0);
if (bf>0) {
bf = 1/bf;
}
var af:Number = ((a & 1) == 1 ? 1 : 0)+((a & 2) == 2 ? 1 : 0)+((a & 4) == 4 ? 1 : 0)+((a & 8) == 8 ? 1 : 0);
if (af>0) {
af = 1/af;
}
var mat:Array = Array((r & 1) == 1 ? rf : 0, (r & 2) == 2 ? rf : 0, (r & 4) == 4 ? rf : 0, (r & 8) == 8 ? rf : 0, 0, (g & 1) == 1 ? gf : 0, (g & 2) == 2 ? gf : 0, (g & 4) == 4 ? gf : 0, (g & 8) == 8 ? gf : 0, 0, (b & 1) == 1 ? bf : 0, (b & 2) == 2 ? bf : 0, (b & 4) == 4 ? bf : 0, (b & 8) == 8 ? bf : 0, 0, (a & 1) == 1 ? af : 0, (a & 2) == 2 ? af : 0, (a & 4) == 4 ? af : 0, (a & 8) == 8 ? af : 0, 0);
concat(mat);
}
public function blend(m:ColorMatrix, amount:Number):Void {
var inv_amount:Number = 1-amount;
for (var i:Number = 0; i<20; i++) {
matrix[i] = inv_amount*matrix[i]+amount*m.matrix[i];
}
}
public function concat(mat:Array):Void {
var temp:Array = Array ();
var i:Number = 0;
for (var y:Number = 0; y < 4; y++ )
{
for (var x:Number = 0; x < 5; x++ )
{
temp[i + x] = mat[i ] * matrix[x ] +
mat[i+1] * matrix[x + 5] +
mat[i+2] * matrix[x + 10] +
mat[i+3] * matrix[x + 15] +
(x == 4 ? mat[i+4] : 0);
}
i+=5;
}
matrix = temp;
}
public function get filter():ColorMatrixFilter {
return new ColorMatrixFilter(matrix);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -