请教高手,关于色相,饱和度,亮度,对比度
其实就是falsh里面“调整颜色”滤镜的功能,只是我想在falsh里面实现,让用户可以自己来调节色相,饱和度,亮度,对比度不知道rgba的值应该怎样变化才能实现?:confused:
flash帮助文档里面只给出了一个很简单的示例,如下所示:
下面的示例使用 BitmapFilter 来根据鼠标指针的位置操作图像的颜色饱和度。如果将鼠标指针置于左上角 (0,0),图像应保持不变。随着鼠标指针的右移,绿色通道和蓝色通道一起从图像中删除。随着鼠标指针的下移,红色通道被删除。如果将鼠标指针置于舞台的右下方,图像应完全变黑。此示例假设您的库中具有链接标识符设置为"YourImageLinkage"的图像。
import flash.filters.BitmapFilter;
import flash.filters.ColorMatrixFilter;
var image:MovieClip = this.attachMovie("YourImageLinkage", "YourImage", this.getNextHighestDepth());
image.cacheAsBitmap = true;
var listener:object = new Object();
listener.image = image;
listener.onMouseMove = function() {
var xPercent:Number = 1 - (_xmouse/Stage.width);
var yPercent:Number = 1 - (_ymouse/Stage.height);
var matrix:Array = new Array();
matrix = matrix.concat([yPercent, 0, 0, 0, 0]); // red
matrix = matrix.concat([0, xPercent, 0, 0, 0]); // green
matrix = matrix.concat([0, 0, xPercent, 0, 0]); // blue
matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha
var filter:BitmapFilter = new ColorMatrixFilter(matrix);
image.filters = new Array(filter);
}
Mouse.addListener(listener);
listener.onMouseMove();
请问要调节色相,饱和度,亮度,对比度,rgba的值应该如何变化??望高手可以解答,相关资料吗?
[[i] 本帖最后由 HBrO 于 2006-9-21 14:53 编辑 [/i]] 顶,希望高手指点一下 在顶,期待高手解答 up 色相,饱和度的RGB转换需要一套固定的公式,你可以GOOGLE一下,记得网上有开源的作品的…… 不太清楚,还以为flash8直接支持了,这东东有用啊
[[i] 本帖最后由 FlashK 于 2006-7-20 15:24 编辑 [/i]] 自己摸索了一下, 好像是这样子的. ..
0xFFFFFF -> c.r=255; c.g=255; c.b=255
function hex2RGB(hex) {
var c:Object = {r:0, g:0, b:0};
hex = hex.toString(16);
while (hex.length<6) {
hex = "0"+hex;
}
c.r = Number("0x"+hex.substr(0, 2));
c.g = Number("0x"+hex.substr(2, 2));
c.b = Number("0x"+hex.substr(4, 2));
return c;
}
function RGB2Hex(rgb) {
var h = new Object();
h.r = rgb.r.toString(16).length<2 ? "0"+rgb.r.toString(16) : rgb.r.toString(16);
h.g = rgb.g.toString(16).length<2 ? "0"+rgb.g.toString(16) : rgb.g.toString(16);
h.b = rgb.b.toString(16).length<2 ? "0"+rgb.b.toString(16) : rgb.b.toString(16);
return "0x"+h.r+h.g+h.b;
}
不知道正统的算法是怎样地~~~~哈, 先跟个帖炒起来..
[[i] 本帖最后由 OneNature 于 2006-7-20 16:17 编辑 [/i]]
Color类
Color类(AS3):(改写自Robert Penner的Color类)package {
import flash.display.Sprite ;
import flash.geom.ColorTransform;
public class Color {
public static function setRGB(mc:Sprite,col:uint):void{
var color:ColorTransform=new ColorTransform() ;
color.color=col ;
mc.transform.colorTransform=color ;
}
public static function getRGB(mc:Sprite):uint{
return mc.transform.colorTransform.color ;
}
public static function getRGBstr(mc:Sprite):String{
var hexStr:String=mc.transform.colorTransform.color.toString(16);
//trace("hex ="+hexStr);
var toFill:int =6-hexStr.length ;
while(toFill--){ hexStr="0"+hexStr; }
hexStr="0x"+hexStr ;
return hexStr ;
}
// r= -255 ~ 255 .
public static function setRGB2(mc:Sprite,r:uint,g:uint,b:uint):void {
var c:uint= (r << 16 | g << 8 | b ) ;
setRGB(mc,c);
}
public static function getRGB2(mc:Sprite):Object {
var c:ColorTransform= mc.transform.colorTransform ;
return { r:c.redOffset,g:c.greenOffset,b:c.blueOffset } ;
}
public static function reset(mc:Sprite ):void {
mc.transform.colorTransform= new ColorTransform();
}
public static function setBrightness(mc:Sprite,bright:uint):void{
var trans:ColorTransform=mc.transform.colorTransform ;
with(trans){
redMultiplier=greenMultiplier=blueMultiplier=(100-Math.abs(bright))/100 ;
redOffset=greenOffset=blueOffset=(bright > 0 ) ? bright*(256/100) : 0 ;
}
mc.transform.colorTransform=trans ;
}
//offset = -255~ 255 .
public static function setBrightOffset(mc:Sprite,offset:uint):void{
var trans:ColorTransform=mc.transform.colorTransform ;
with(trans){
redOffset=greenOffset=blueOffset=offset ;
}
mc.transform.colorTransform=trans ;
}
public static function setTint(mc:Sprite,r:uint,g:uint,b:uint,percent:uint):void{
var per:Number=percent/100 ;
var trans:ColorTransform=mc.transform.colorTransform ;
with(trans){
redOffset = per*redOffset ;
greenOffset = per*greenOffset ;
blueOffset = per*blueOffset ;
redMultiplier=greenMultiplier=blueMultiplier=(100-percent)/100 ;
}
mc.transform.colorTransform=trans ;
}
public static function getTint(mc:Sprite):Object {
var trans:ColorTransform=mc.transform.colorTransform ;
var tint:Object=new Object() ;
tint.percent=(1-trans.redMultiplier )*100;
var per:Number=100/tint.percent ;
tint.r = Math.round(per*trans.redOffset) ;
tint.g = Math.round(per*trans.greenOffset) ;
tint.b = Math.round(per*trans.blueOffset) ;
return tint ;
}
public static function setTintOffset(mc:Sprite,r:uint,g:uint,b:uint):void{
var trans:ColorTransform=mc.transform.colorTransform ;
with(trans){
redOffset = r ;
greenOffset = g ;
blueOffset = b ;
}
mc.transform.colorTransform=trans ;
}
public static function getTintOffset(mc:Sprite):Object {
var trans:ColorTransform=mc.transform.colorTransform ;
var tint:Object=new Object() ;
tint.rb = trans.redOffset;
tint.gb = trans.greenOffset ;
tint.bb = trans.blueOffset ;
return tint ;
}
public static function invert(mc:Sprite):void{
var trans:ColorTransform=mc.transform.colorTransform ;
with(trans){
redMultiplier = -redMultiplier ;
greenMultiplier = -greenMultiplier ;
blueMultiplier = -blueMultiplier ;
redOffset = 255-redOffset ;
greenOffset = 255-greenOffset;
blueOffset = 255-blueOffset;
}
mc.transform.colorTransform=trans ;
}
//percent=0~100
public static function setNegative(mc:Sprite,percent:Number):void{
var trans:ColorTransform=mc.transform.colorTransform ;
with(trans){
redMultiplier = greenMultiplier = blueMultiplier =(100-2*percent)/100;
redOffset = greenOffset = blueOffset =percent*(255/100);
}
mc.transform.colorTransform=trans ;
}
public static function getNegative(mc:Sprite):Number{
var trans:ColorTransform=mc.transform.colorTransform ;
return trans.redOffset*(100/255) ;
}
public static function setRed(mc:Sprite,r:uint):void{
var t:ColorTransform=mc.transform.colorTransform ;
var c:uint= ( r << 16 | t.greenOffset << 8 | t.blueOffset );
setRGB(mc,c);
}
public static function setGreen(mc:Sprite,r:uint):void{
var t:ColorTransform=mc.transform.colorTransform ;
var c:uint= ( t.redOffset << 16 | r << 8 | t.blueOffset );
setRGB(mc,c);
}
public static function setBlue(mc:Sprite,r:uint):void{
var t:ColorTransform=mc.transform.colorTransform ;
var c:uint= ( t.redOffset << 16 | t.greenOffset << 8 | r );
setRGB(mc,c);
}
public static function getRed(mc:Sprite):uint{
return mc.transform.colorTransform.redOffset;
}
public static function getGreen(mc:Sprite):uint{
return mc.transform.colorTransform.greenOffset;
}
public static function getBlue(mc:Sprite):uint{
return mc.transform.colorTransform.blueOffset;
}
}
}
[[i] 本帖最后由 haxe 于 2006-7-20 17:32 编辑 [/i]] 标准的做法, 使用位操作
[html]
Color.HEXtoRGB = function(hex) {
var rgb24 = (isNaN(hex)) ? parseInt(hex, 16) : hex;
var r = rgb24 >> 16;
var g = (rgb24 ^ (r << 16)) >> 8;
var b = (rgb24 ^ (r << 16)) ^ (g << 8);
return {r:r, g:g, b:b};
}
[/html]
ColorMatrix类
改写自:www.quasimondo.com[list]
package {
public class ColorMatrix
{
private static var r_lum:Number = 0.3086;
private static var g_lum:Number = 0.6094;
private static var b_lum:Number = 0.0820;
private static var INIT:Array =new 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
Constructor
Parameters:
mat - if omitted matrix gets initialized with an
identity matrix. Alternatively it can be
initialized with another ColorMatrix or
an array (there is currently no check
if the array is valid. A correct array
contains 20 elements.)
*/
public function ColorMatrix ( ...arguments )
{
if (arguments.length==1)
{
matrix = arguments[0].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 = INIT.concat();
}
//设置饱和度(-3 - 3 )
/*
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 setSaturation ( s:Number ):void
{
var lis:Number=1-s;
var irlum:Number = lis * r_lum;
var iglum:Number = lis * g_lum;
var iblum:Number = lis * b_lum;
var mat:Array = new 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);
}
//设置对比度(-2 - 5)
public function setContrast (...arguments):void
{
var mat:Array;
if(arguments.length==1){
var r:Number=arguments[0] ;
r+=1 ;
mat=new Array(r,0,0,0,128*(1-r),
0,r,0,0,128*(1-r),
0,0,r,0,128*(1-r),
0,0,0,1,0);
}else if(arguments.length==3){
var r1:Number=arguments[0];
var g:Number=arguments[1];
var b:Number=arguments[2];
mat =new Array(r1,0,0,0,128*(1-r1),
0,g,0,0,128*(1-g),
0,0,b,0,128*(1-b),
0,0,0,1,0);
}
concat(mat);
}
//设置亮度(0-255)
public function setBrightness (...arguments):void
{
var mat:Array;
if(arguments.length==1){
var r:Number=arguments[0] ;
mat= new Array( 1,0,0,0, r,
0,1,0,0, r,
0,0,1,0, r,
0,0,0,1, 0 );
}else if(arguments.length==3){
mat= new Array( 1,0,0,0, arguments[0],
0,1,0,0, arguments[1],
0,0,1,0, arguments[2],
0,0,0,1, 0 );
}
concat(mat);
}
//设置反转效果(0-360)
public function setHue( rot:Number ):void
{
rot*=Math.PI/180;
var c:Number = Math.cos(rot);
var s:Number = Math.sin(rot);
var f1:Number = 0.213;
var f2:Number = 0.715;
var f3:Number = 0.072;
var mat:Array = new 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);
}
//设置透明度(0-1)
public function setAlpha( alpha:Number ):void
{
var mat:Array = new 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 = new 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 = new 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 = new 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 setChannels (r:Number, g:Number, b:Number, a:Number ):void
{
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 =new 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 concat(mat:Array):Array
{
var temp:Array =new Array ();
var i:int = 0;
for (var y:int = 0; y < 4; y++ )
{
for (var x:int = 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;
return temp ;
}
}
}
[/list]
[[i] 本帖最后由 haxe 于 2006-7-20 17:20 编辑 [/i]] [quote]原帖由 [i]haxe[/i] 于 2006-7-20 04:45 PM 发表
Color类:(改写自Robert Penner的Color类)
package {
import flash.display.Sprite ;
import flash.geom.ColorTransform;
public class Color {
public static function setRGB(mc:Sprite,col:u ... [/quote]
我说你没必要把 as3 的东西拿出来吧? 人家是在问 as2 的
除非你想让人家知道你这个类功能如何如何, 并且是用 as3 写的 :o:o 我这边没有AS2的。 要么改一下给他... 否则给也是白给啊..... 这也是...,我找找。 晕了 我也是想要达到这种效果啊 完整的做法怎么做啊??谢了哈 强,还真的拿公式算了出来. 顶一下,谢谢。 看一下PS帮助就知道个大概了.
页:
[1]