AS3で色付きのビットマップのビットマップデータを白黒に変更するにはどうすればよいですか? 私はフラッシュで CMS 用のシンプルな画像編集ツールを開発しています。
アップロードされたビットマップの色を白黒に切り替えることができるはずです。bitmapdata 自体を変更したいので、後で Adobeの JPGEncoder クラスを使用して ByteArray に書き込むことができます。
AS3で色付きのビットマップのビットマップデータを白黒に変更するにはどうすればよいですか? 私はフラッシュで CMS 用のシンプルな画像編集ツールを開発しています。
アップロードされたビットマップの色を白黒に切り替えることができるはずです。bitmapdata 自体を変更したいので、後で Adobeの JPGEncoder クラスを使用して ByteArray に書き込むことができます。
これは私が推測する最もエレガントな解決策です(source
あなたであるとBitmapData
):
const rc:Number = 1/3, gc:Number = 1/3, bc:Number = 1/3;
source.applyFilter(source.bitmapData, source.bitmapData.rect, new Point(), new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0]));
と..。flash.geom::Point
_flash.filters::ColorMaxtrixFilter
ColorMatrixFilter
色相の変化、色付け、明るくする、暗くする、彩度を下げるなど、多くのことを可能にします...それ以外BitmapData::paletteMap
の場合BitmapData::colorTransform
は、優れた補完物です...
ただ注意したかったのは、以下を使用することです
const rc:Number = 1/3, gc:Number = 1/2, bc:Number = 1/6;
#00FF00
主観的にはより明るいので#FF0000
、もう少し自然に見えます。#0000FF
じゃあ、頑張ってね ... ;)
グリーツ
back2dos
実際には、 back2dos のソリューションをもっと簡単な方法で使用できます。
const rc:Number = 1/3, gc:Number = 1/3, bc:Number = 1/3;
mc.filters = [ new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0]) ];
ここで、mc は、ビットマップデータがビジュアル要素として存在する MovieClip または Sprite コンテナーです。ありがとうback2dos :)
getPixel と setPixel を使用して、色を平均化するだけです (フィルターなどを使用してこれを行う別の方法があると思います)。
for(int i = 0; i < bitmapData.height; i++)
{
for(int j = 0; j < bitmapData.width; j++)
{
var color:uint = bitmapData.getPixel(i, j);
var red:uint = color & 0xFF0000 >> 16;
var green:uint = color & 0x00FF00 >> 8;
var blue:uint = color & 0x0000FF >> 0;
var bwColor:uitn = red + green + blue / 3;
bwColor = bwColor << 16 + bwColor << 8 + bwColor; // puts the average in each channel
bitmapData.setPixel(i, j, bwColor);
}
}
Cookie に感謝します。元のビットマップデータをコピーすることは、色を復元するための最も簡単な解決策でした。
function clearColor() {
colorbmd = new BitmapData(source.width, source.height);
colorbmd = source.clone();
//apply filter here
}
function restoreColor() {
source = colorbmd;
}
画像を白黒に変換すると、元に戻すことはできないと思います(変換中に情報が失われます)。フィルターを適用する前に、コピーを作成する必要があります。– CookieOfFortune
アプローチに感謝します。値をいじることができる小さなツールを作成しました: http://bjornson.inhb.de/?p=159
初期値は、macke によって提案された値です。RGB の場合、30%、59%、および 11% です。
また、外部画像を読み込んで、画像の最良の結果を試すこともできます。
両方の方法を試しました。大きな画像を扱うときは、ColorMatrixFilter メソッドの方がはるかに高速に動作するようです。
フィルターも削除する方法はありますか?または、ColorMatrixFilter の値をもう一度変更する必要がありますか?