既存の画像ファイルにフィルターをかける
サンプル01では新規に画像を生成していましたが、今度は既存の画像ファイルを開いて、フィルター処理を適用してみましょう。ここでは本連載の第3回で作成したPhotoshop用のフィルターと同じく、画像を赤色に変更するフィルターを作成します。
最初に画像ファイルを開きます。ここではホームフォルダ内にある「sample.jpg」ファイルを開くことにしましょう。1ページ目でも説明したとおり、new BitmapData()の引数にファイルオブジェクトを指定すると任意のファイルをキャンバスに開けます。
var myCanvas = new BitmapData(new File("~/sample.jpg"));
ちなみに、JPEG画像だけでなくカメラRAWファイルにも対応していますが、最大8192×8192ピクセルまでのサイズ制限があります。
画像キャンバス上のピクセルはgetPixel()で読み出せます(*1)。第1引数にX座標、第2引数にY座標を指定します。getPixel()は読み出した色の情報をカラー値として返しますが、このままだとフィルター処理には面倒なので、Colorオブジェクトに変換します。new Color()の引数にgetPixel()で読み出した値を指定すれば、自動的にRGBα値に分けられます。
Colorオブジェクトのred, green, blueプロパティに、それぞれの色の輝度が入っているので、読み出して色ごとに処理を書きます。処理ができたら、再度ColorオブジェクトにしてsetPixel()の引数に指定します。
ここまでをまとめたものがサンプル02です。ホームフォルダ内にある「sample.jpg」ファイルを読み込んでフィルター処理を実行した後、ホームフォルダに「BridgeSample_0001.jpg」という名前で保存します。
●サンプル02
#target "Bridge"
var myCanvas = new BitmapData(new File("~/sample.jpg"));
for(var y=0; y<myCanvas.height; y++){
for(var x=0; x<myCanvas.width; x++){
var colorObj = new Color(myCanvas.getPixel(x, y));
var R = colorObj.red;
var G = colorObj.green;
var B = colorObj.blue;
R = R * 2;
if (R > 255) R = 255;
G = Math.floor(G / 2);
B = Math.floor(B / 2);
var myColor = new Color(R, G, B);
myCanvas.setPixel(x,y, myColor);
}
}
myCanvas.exportTo(new File("~/BridgeSample_0001.jpg"), 100);
(*1) αチャネルの値も処理したい場合にはsetPixel32()、getPixel32()という専用のメソッドが用意されています。