2011-08-05 6 views
2

FlexのImageでColorMatixFilterを使用しています。私は本当に私がフィルタから必要としたいことを得ることに近づいています。基本的には、ユーザーがアップロードするPNGファイルです。透明でないすべてのピクセルを黒色にしたいとします。私はすでに "明るさ"を設定する関数を持っているので、-1000のような本当に大きな負の数を通過するだけですが、問題は問題ありません。後で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としてどのようにエンコーディングしているかに関係しています。多くのエンコーダは、このプロセスでアルファチャンネルを失います。それについての詳細を教えてください。また、クライアントでエンコードしないのはなぜですか? ImageSnapshotはpngエンコードを行うことができます。 –

+0

Jacob Eggersのように、透明ピクセルがアルファチャンネルを失うと、白が通常はデフォルトの色になります –

答えて

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); 

私たちはここで設定したことpngの各画素を調べ、アルファ場合は黒としてピクセルカラーに置き換えられますthreshold()の呼び出しですそのピクセルの値は100%(0xff)ではありません。

この場合、thresholdは、0xff000000ARGB値)です。これは、透過率100%で黒に対応します。マスクの色も0xff000000に設定され、threshold()には、各ピクセルのアルファ値(ARGBの 'A')のみが必要であることがわかります。 operationの値は、maskColorを適用して決定したピクセル値がthreshold未満の場合は「より小さい」を意味し、colorに置き換えます。

+0

これはトリックでした。助けてくれてありがとう。 – mattwallace

関連する問題