2010-07-13 27 views

回答

2

0x000000是黑色的,所以接近黑色的任何東西都會變暗(反正更灰)。所以,如果你將自己和0x00之間的每個字節的差異分開,它會很快變暗。例如,如果你想要10個陰影,你可以將它拆分爲10,然後迭代去除10分之1。

更新:

我前一段時間寫了這個:

/** 
    * Create new color blended into another. 
    * @param color to blend 
    * @param into other color 
    * @param factor amount of original color to keep, i.e. 0 would be no "color", all "into" 
    * @param blendAlpha uses the 0xFF000000 part of the color as well 
      * @returns blended color uint 
    */ 
    public static function blendColor(color:uint, into:uint=0xFFFFFFFF, factor:Number=0.5, blendAlpha:Boolean=false) : uint 
    { 
     if(factor < 0 || factor > 1) factor = 0.5; 
     var a1:uint = (color >> 24) & 0xFF; 
     var r1:uint = (color >> 16) & 0xFF; 
     var g1:uint = (color >> 8) & 0xFF; 
     var b1:uint = (color >> 0) & 0xFF; 
     var a2:uint = ( into >> 24) & 0xFF; 
     var r2:uint = ( into >> 16) & 0xFF; 
     var g2:uint = ( into >> 8) & 0xFF; 
     var b2:uint = ( into >> 0) & 0xFF; 
     var a3:uint = (a1*factor + a2*(1-factor)) & 0xFF; 
     var r3:uint = (r1*factor + r2*(1-factor)) & 0xFF; 
     var g3:uint = (g1*factor + g2*(1-factor)) & 0xFF; 
     var b3:uint = (b1*factor + b2*(1-factor)) & 0xFF; 
     return (blendAlpha?a3<<24:0x0) | (r3<<16) | (g3<<8) | b3; 
    } 
+0

我將如何使用動態顏色輸入來編程? – daidai 2010-07-13 00:42:23

+1

更新了我的個人混合功能。 – eruciform 2010-07-13 00:47:12

+1

請注意,雖然您的代碼是正確的,但分別縮放RGB組件不會產生相同顏色/色調的不同色調(除灰色外)。 – 2010-07-13 01:02:46

1

0×00 00 00紅綠藍。含義0xFF0000爲純紅色,0x00FF00爲純綠色,0x0000FF爲純藍色。所以如果你想變暗,從0xFF開始降低十六進制值。如果您想要從0x0066FF縮放黑暗,您需要確保保持RGB的相同比例。含義0xFF00FF - > 0xCC00CC - > 0x990099 - > 0x660066 - > 0x330033 - > 0x000000。

原諒部分答案,但希望這足以讓您自行找出更具體的實施細節。

+0

基本顏色是動態的,是否有一個我可以使用的普遍方程? – daidai 2010-07-13 00:41:58

3

除了你的輸入顏色是灰色陰影,RGB不會削減它。 RGB對於存儲像素數據非常有用,但很難用「可視」有意義的方式進行操作。

前段時間我在Flash編程器的列表中寫了一個類似的答案,所以接下來的是或多或少的逐字拷貝&該答案的粘貼。希望對你有幫助。

準確改變基本色的陰影的方法是將RGB值轉換爲HSL color space,然後調整亮度(亮度),然後轉換回RGB。 這裏有一個方便的類來轉換RGB < - > HLS。

http://www.dreaminginflash.com/2007/11/19/hls-to-rgb-rgb-to-hls/

下面是一些測試代碼:

import ColorUtils; 
var rgb:Number = 0x336699; 
var hls:Object = ColorUtils.RGBtoHLS(rgb); 
var darkL:Number = Math.max(hls.l - 0.2,0); 
var lightL:Number = Math.min(hls.l + 0.2,1); 
var dark:Number = ColorUtils.HLStoRGB(hls.h,darkL,hls.s); 
var light:Number = ColorUtils.HLStoRGB(hls.h,lightL,hls.s); 
var origBmd:BitmapData = new BitmapData(40,40,false,rgb); 
var darkerBmd:BitmapData = new BitmapData(40,40,false,dark); 
var lighterBmd:BitmapData = new BitmapData(40,40,false,light); 
var origBm:Bitmap = new Bitmap(origBmd); 
var darkerBm:Bitmap = new Bitmap(darkerBmd); 
var lighterBm:Bitmap = new Bitmap(lighterBmd); 

darkerBm.y = 0; 
origBm.y = 50; 
lighterBm.y = 100; 

addChild(origBm); 
addChild(darkerBm); 
addChild(lighterBm); 
相關問題