AS3で画像処理。
「誤差拡散法」という手法でハーフトーン処理を行ってます。
以下、ソースです。
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.MouseEvent;
import flash.filters.ColorMatrixFilter;
import flash.geom.Point;
[SWF(backgroundColor="#000000")]
public class Main extends Sprite
{
[Embed(source='image.jpg')]
private var img:Class;
private var bmp:Bitmap;
private var source:BitmapData;
private var dest:BitmapData;
private var count:int = 0;
public function Main()
{
stage.quality = StageQuality.HIGH;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.frameRate = 40;
// ソース画像を作成
source = (new img as Bitmap).bitmapData;
source.applyFilter(source, source.rect, new Point, new ColorMatrixFilter([1/3,1/3,1/3,0,0,1/3,1/3,1/3,0,0,1/3,1/3,1/3,0,0,0,0,0,1,0]));
var w:Number = source.width;
var h:Number = source.height;
// 誤差を保存するバッファ
var buff:Array = [];
for(var i:int=0 ; i<w ; i++)
{
buff[i] = [];
for(var j:int=0 ; j<h ; j++) buff[i][j]=(source.getPixel(i,j) & 0xFF) as Number;
}
// 処理画像
dest = source.clone();
// 計算
for(j=0 ; j<h ; j++)
{
for(i=0 ; i<w ; i++)
{
var err:Number;
if(buff[i][j] > 127)
{
dest.setPixel(i,j,0xffffff);
err = buff[i][j] - 255;
}
else
{
dest.setPixel(i,j,0x000000);
err = buff[i][j];
}
// 誤差を拡散
if(i+1 < w) buff[i+1][j] += err*7/16;
if(j+1 < h) buff[i][j+1] += err*5/16;
if(i+1 < w && j+1 < h) buff[i+1][j+1] += err/16;
if(i-1 >= 0 && j+1 < h) buff[i-1][j+1] += err*3/16;
}
}
// 画像を表示
bmp = addChild(new Bitmap(dest)) as Bitmap;
bmp.x = bmp.y = 50;
count = 0;
stage.addEventListener(MouseEvent.CLICK, onClick);
}
// 元画像と処理後画像を切り替える
private function onClick(e:MouseEvent):void
{
count ++;
if(count %2 == 0) bmp.bitmapData = dest;
else bmp.bitmapData = source;
}
}
}
