package { import flash.display.Sprite; [SWF(width = "465", height = "465", frameRate = "60", backgroundColor = "#000000")] /** * 何でもスーラ -Seurat anything- * 点描派風ピクセラレート * ネタ元:Beyond Interaction -メディアアートのための openFrameworks プログラミング入門 P169 * http://www.amazon.co.jp/gp/product/4861006708?ie=UTF8&tag=laxcomplex-22&linkCode=as2&camp=247&creative=1211&creativeASIN=4861006708 * @author Aquioux(Yoshida, Akio) */ public class Main extends Sprite { public function Main():void { // model var model:Model = new Model(); // _view var view:View = new View(model); addChild(view); // controller var controller:Controller = new Controller(model); addChild(controller); // 参照のセット controller.view = view; } } } import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.events.Event; import flash.events.EventDispatcher; import flash.geom.Matrix; import flash.net.FileReference; import flash.utils.ByteArray; /** * Model * @author YOSHIDA, Akio (Aquioux) */ class Model extends EventDispatcher { // ---------- パブリックプロパティ ---------- // // 表示する縦 or 横の長い方の最大値 static public const MAX_SIZE:uint = 400; // View へ渡すデータ public function get data():BitmapData { return _data; } private var _data:BitmapData; // ---------- ローカルプロパティ ---------- // private var fileRef_:FileReference; private var loader_:Loader; // ---------- パブリックメソッド ---------- // /** * コンストラクタ */ public function Model() { fileRef_ = new FileReference(); loader_ = new Loader(); } /** * 画像ロード step 1 ファイル選択 * Controller 向けに開かれたメソッド */ public function loadHandler():void { fileRef_.addEventListener(Event.SELECT, load2Handler); fileRef_.browse(); } // ---------- ローカルメソッド ---------- // // 画像ロード step 2 ファイル読込 private function load2Handler(e:Event):void { fileRef_.removeEventListener(Event.SELECT, arguments.callee); fileRef_.addEventListener(Event.COMPLETE, load3Handler); fileRef_.load(); } // 画像ロード step 3 ファイル読込完了 private function load3Handler(e:Event):void { fileRef_.removeEventListener(Event.COMPLETE, arguments.callee); loader_.loadBytes(fileRef_.data); loader_.contentLoaderInfo.addEventListener(Event.COMPLETE, load4Handler); } // 画像ロード step 4 ファイル読込後の処理 private function load4Handler(e:Event):void { loader_.contentLoaderInfo.removeEventListener(Event.COMPLETE, arguments.callee); update(Bitmap(loader_.content).bitmapData); } // _data のアップデート private function update(bmd:BitmapData):void { // 読み込んだ画像ファイルの BitmapData の処理 var w:uint = bmd.width; var h:uint = bmd.height; var scale:Number = Math.min(MAX_SIZE / w, MAX_SIZE / h); if (scale > 1) scale = 1; if (_data) _data.dispose(); _data = new BitmapData(w * scale, h * scale); _data.draw(bmd, new Matrix(scale, 0, 0, scale)); // CHANGE イベント発行 dispatchEvent(new Event(Event.CHANGE)); } } import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.filters.BitmapFilterQuality; import flash.filters.BlurFilter; import flash.geom.Matrix; import frocessing.color.ColorRGB; /** * View * @author YOSHIDA, Akio (Aquioux) */ class View extends Sprite { // ---------- パブリックプロパティ ---------- // // Model の参照 public function set model(value:Model):void { _model = value; } private var _model:Model; // Controller の参照 public function set controller(value:Controller):void { _controller = value; } private var _controller:Controller; // ---------- ローカルプロパティ ---------- // private var bm_:Bitmap; private var bmd_:BitmapData; // ---------- パブリックメソッド ---------- // /** * コンストラクタ * @param model Model */ public function View(model:Model) { _model = model; _model.addEventListener(Event.CHANGE, changeHandler); bm_ = new Bitmap(); bm_.filters = [new BlurFilter(2, 2, BitmapFilterQuality.HIGH)]; addChild(bm_); } // ---------- ローカルメソッド ---------- // // Model から Event.CHANGE が発行されたときの処理(ロード時の処理) private function changeHandler(e:Event):void { // 読み込まれたデータ var bmd:BitmapData = _model.data; // BitmapData のサイズ var w:uint = bmd.width; var h:uint = bmd.height; // 表示オフセット var sw:uint = stage.stageWidth; var sh:uint = stage.stageHeight; var offsetX:Number = (sw - w) / 2; var offsetY:Number = (sh - h) / 2; // ColorRGB インスタンス var rgb:ColorRGB = new ColorRGB(); if (!bmd_) bmd_ = new BitmapData(sw, sh, true, 0xFF000000); // キャンバスリセット bmd_.fillRect(bmd_.rect, 0xFF000000); // BitmapData 解析、Dot 生成 var colors:Vector.<uint> = bmd.getVector(bmd.rect); var radius:uint = 4; var interval:uint = radius * 2; var dot:Dot = new Dot(radius); var matrix:Matrix = new Matrix(); for (var j:int = 0; j < h; j += interval) { for (var i:int = 0; i < w; i += interval) { var idx:uint = w * j + i; rgb.value32 = colors[idx]; dot.draw(rgb); matrix.tx = i + offsetX; matrix.ty = j + offsetY; bmd_.draw(dot, matrix); } } bm_.bitmapData = bmd_; } } import com.bit101.components.PushButton; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; /** * Controller * @author YOSHIDA, Akio (Aquioux) */ class Controller extends Sprite { // ---------- パブリックプロパティ ---------- // // Model の参照 public function set model(value:Model):void { _model = value; } private var _model:Model; // View の参照 public function set view(value:View):void { _view = value; } private var _view:View; // ---------- ローカルプロパティ ---------- // private var loadButton_:PushButton; // ロードボタン // ---------- パブリックメソッド ---------- // /** * コンストラクタ * @param model Model */ public function Controller(model:Model) { _model = model; // ロードのボタン loadButton_ = new PushButton(this, 0, 0, "LOAD", loadHandler); loadButton_.width = 50; } // ---------- ローカルメソッド ---------- // // ロードボタンのイベントハンドラ private function loadHandler(e:MouseEvent):void { _model.loadHandler(); } } import flash.display.BlendMode; import flash.display.Graphics; import flash.display.Shape; import flash.display.Sprite; import frocessing.color.ColorRGB; /** * ... * @author YOSHIDA, Akio (Aquioux) */ class Dot extends Sprite { private var radius_:uint; private var circles_:Array; public function Dot(radius:uint) { radius_ = radius; circles_ = []; for (var i:int = 0; i < 3; i++) { var circle:Shape = new Shape(); circle.blendMode = BlendMode.ADD; addChild(circle); circles_.push(circle); } } public function draw(rgb:ColorRGB):void { var v:Vector.<uint> = new Vector.<uint>(3, true); v[0] = rgb.r; v[1] = rgb.g; v[2] = rgb.b; for (var i:int = 0; i < 3; i++) { var circle:Shape = circles_[i]; var g:Graphics = circle.graphics; g.clear(); g.beginFill(0xFF << 8 * (2 - i)); g.drawCircle(Math.random() - 0.5, Math.random() - 0.5, radius_ * v[i] / 255); g.endFill(); } } } 何でもスーラ -Seurat anything-