概要
二値化グラデーションを作ってみましょう。
これが元画像です。
普通、二値化の場合は黒と白に変換させますが、この画像のように片方が白でもう片方がグラデーションになっているのが二値化グラデーションです。
アルゴリズム
手っ取り早く実装する方法は、画像を二値化するときに片方を白にして、もう片方を透明色にすればいいです。
透明色は背景部分が表示されるのでそこに前もってグラデーションを塗っておけば完成です。
透明色は背景部分が表示されるのでそこに前もってグラデーションを塗っておけば完成です。
プログラム
対象画像の読み込み方法は、画像処理用のテンプレートを参照してください。
private const WIDTH:int = 300;
private const HEIGHT:int = 300;
サイズを指定するところが多いので変更点があると書き直すのが面倒です。
なのでインスタンス変数にWIDTH, HEIGHT定数を記述しておきましょう。
なのでインスタンス変数にWIDTH, HEIGHT定数を記述しておきましょう。
var matrix:Matrix = new Matrix();
matrix.createGradientBox(WIDTH, HEIGHT, 90 * Math.PI / 180);
var gradation:Sprite = new Sprite();
gradation.graphics.beginGradientFill("linear", [0, 0xFFFFFF], [1.0, 1.0], [0, 255], matrix);
gradation.graphics.drawRect(0, 0, WIDTH, HEIGHT);
gradation.graphics.endFill();
addChild(gradation);
前もってグラデーションを塗っておきましょう。角度は90度にしておきます。
グラデーションについては、グラデーションを使用するを参照してください。
グラデーションについては、グラデーションを使用するを参照してください。
private function binarization(bd:BitmapData):BitmapData
{
var dest:BitmapData = bd.clone();
dest.threshold(dest, dest.rect, new Point(), "<=", 0x7F, 0x0, 0xFF, false);
dest.threshold(dest, dest.rect, new Point(), "!=", 0x0, 0xFFFFFFFF, 0xFF, false);
return dest;
}
二値化(threshold編)で書いたコードを少し変更しただけです。
まず対象のピクセル(青だけ)が0x7Fよりも暗ければ、アルファ値0の色に変換されます。
二つめのthreshold()は青が0で無ければ(アルファ値1.0の)白に変換するというコードです。
まず対象のピクセル(青だけ)が0x7Fよりも暗ければ、アルファ値0の色に変換されます。
二つめのthreshold()は青が0で無ければ(アルファ値1.0の)白に変換するというコードです。
var matrix:Matrix = new Matrix();
matrix.createGradientBox(WIDTH, HEIGHT, 45 * Math.PI / 180);
var gradation:Sprite = new Sprite();
gradation.graphics.beginGradientFill("linear", [0x313131, 0xFCC707], [1.0, 1.0], [0, 255], matrix);
gradation.graphics.drawRect(0, 0, WIDTH, HEIGHT);
gradation.graphics.endFill();
addChild(gradation);
グラデーションの色や角度を変えてみると面白いかもしれません。
検証用コード
package
{
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Loader;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import flash.system.Security;
public class Main extends Sprite
{
private const WIDTH:int = 300;
private const HEIGHT:int = 300;
public function Main()
{
Security.loadPolicyFile("http://farm1.static.flickr.com/crossdomain.xml");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
loader.load(new URLRequest("http://farm4.static.flickr.com/3172/2506688567_219873f231.jpg"), new LoaderContext(true)); // 読み込みたい画像URL
}
private function initHandler(event:Event):void
{
var matrix:Matrix = new Matrix();
matrix.createGradientBox(WIDTH, HEIGHT, 90 * Math.PI / 180);
var gradation:Sprite = new Sprite();
gradation.graphics.beginGradientFill("linear", [0, 0xFFFFFF], [1.0, 1.0], [0, 255], matrix);
gradation.graphics.drawRect(0, 0, WIDTH, HEIGHT);
gradation.graphics.endFill();
addChild(gradation);
var loader:Loader = event.currentTarget.loader;
matrix = new Matrix();
matrix.scale(WIDTH / loader.width, HEIGHT / loader.height);
var bd:BitmapData = new BitmapData(WIDTH, HEIGHT, true);
bd.draw(loader, matrix);
addChild(new Bitmap(binarization(bd)));
}
private function binarization(bd:BitmapData):BitmapData
{
var dest:BitmapData = bd.clone();
dest.threshold(dest, dest.rect, new Point(), "<=", 0x7F, 0x0, 0xFF, false);
dest.threshold(dest, dest.rect, new Point(), "!=", 0x0, 0xFFFFFFFF, 0xFF, false);
return dest;
}
}
}
このwikiの更新情報RSS