2011-08-05 44 views
2

我對Flex中的圖像使用ColorMatixFilter。我真的很接近想要我需要的過濾器。基本上用戶上傳的任何PNG文件我希望所有不透明的像素都是黑色的。我有一個函數,它已經設置了「亮度」,所以我只是通過一個非常大的負數,比如-1000,它可以完成這項工作,但問題是任何像素都有任何alpha,比如說0.9或者更低稍後將我的PNG文件編碼到服務器上時顯示爲白色。如何爲不透明的所有像素着色

這裏是我目前使用的

public static function setBrightness(value:Number):ColorMatrixFilter 
    { 
     value = value * (255/250); 

     var m:Array = new Array(); 
     m = m.concat([1, 0, 0, 0, value]); // red 
     m = m.concat([0, 1, 0, 0, value]); // green 
     m = m.concat([0, 0, 1, 0, value]); // blue 
     m = m.concat([0, 0, 0, 1, 0]); // alpha 

     return new ColorMatrixFilter(m); 
    } 

我想所有的像素是純黑色,除非像素是完全透明的,不知道如何調整值以獲取了它的代碼。

+0

我測試了'ColorMatrix',它看起來對我來說是正確的。問題可能與你如何編碼爲png有關。許多編碼器在這個過程中失去了alpha通道。你能提供更多的細節嗎?另外,爲什麼不在客戶端進行編碼? ImageSnapshot可以做png編碼。 –

+0

像Jacob Eggers一樣,當透明像素失去alpha通道時,白色通常是默認的顏色。 –

回答

5

您應該看看BitmapData.threshold(),因爲它幾乎完全符合您的要求。複述鏈路上的例子,你應該做這樣的事情:

// png is your PNG BitmapData 
var bmd:BitmapData = new BitmapData(png.width, png.height, true, 0xff000000); 
var pt:Point = new Point(0, 0); 
var rect:Rectangle = bmd.rect; 
var operation:String = "<"; 
var threshold:uint = 0xff000000; 
var color:uint = 0x00000000; 
var maskColor:uint = 0xff000000; 
bmd.threshold(png, rect, pt, operation, threshold, color, maskColor, true); 

我們已經設置了這裏是threshold()的話,可以檢查的png每個像素,並帶有黑色的,如果阿爾法取代的像素顏色該像素的值不是100%(0xff)。

在這種情況下,threshold0xff000000(值爲ARGB),其與100%透明度下的黑色對應。我們的面具顏色也設置爲0xff000000,它告訴threshold()我們只對每個像素的alpha值(ARGB中的值)感興趣。我們對於operation的值是「小於」,這意味着如果通過應用maskColor確定的像素值低於threshold,則將其替換爲color

+0

這是個竅門。非常感謝幫忙。 – mattwallace