/* * マウスボタンを押しながら移動することで色を混ぜることが出来ます。 * * strengthスライダーを左に寄せると色が薄く、右に寄せると色が濃くなります。 * 追記: 色が選べるように変更しました。 */ package { import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import com.bit101.components.*; import frocessing.color.ColorHSV; public class Main extends Sprite { private const DIFF:Number = 0.02; private var bd:BitmapData; private var image:BitmapData; private var buffer:Array = new Array(); private var i:int = 0; private var r:int = 0; private var g:int = 0; private var b:int = 0; private var color:int = 0x00FFFF; private var slider:HUISlider; private var cslider:HUISlider; public function Main() { Wonderfl.capture_delay( 30 ); bd = new BitmapData(465, 415, false); var bitmap:Bitmap = new Bitmap(bd, "auto", true); addChild(bitmap); var circle:Sprite = new Sprite(); circle.graphics.beginFill(0x0); circle.graphics.drawCircle(10, 10, 10); circle.graphics.endFill(); image = new BitmapData(circle.width, circle.height, true, 0x0); image.draw(circle); var button:PushButton = new PushButton(this, 365, 445, "clear", clear); slider = new HUISlider(this, 180, 445, "strength"); slider.minimum = 0.1; slider.maximum = 0.8; slider.value = 0.2; clear(); stage.quality = "best"; stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); var cslider:Slider = new Slider(); cslider.y = 465 - cslider.height - 10; cslider.x = 1; cslider.addEventListener(Event.CHANGE, function():void { color = cslider.value; } ); addChild(cslider); } private function clear(event:Event = null):void { bd.fillRect(bd.rect, 0xFFFFFF); } private function onMouseDown(event:MouseEvent):void { buffer.push(new Point(mouseX, mouseY)); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private function onMouseUp(event:MouseEvent):void { buffer = new Array(); i = 0; stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); } private function onMouseMove(event:MouseEvent):void { var mx:int = mouseX; var my:int = mouseY; mx = Math.max(0, mx); my = Math.max(0, my); mx = Math.min(bd.width, mx); my = Math.min(bd.height, my); buffer.push(new Point(mx, my)); if (buffer.length < 3) return; var prev:Point = buffer[i]; var next:Point = buffer[i + 1]; next.x = (prev.x + buffer[i + 2].x) / 2; next.y = (prev.y + buffer[i + 2].y) / 2; var dx:Number = next.x - prev.x; var dy:Number = next.y - prev.y; var s:Number = 0.3 / Math.sqrt(dx * dx + dy * dy) / 2; var colorA:ColorHSV = new ColorHSV(); var colorB:ColorHSV = new ColorHSV(); var colorC:ColorHSV = new ColorHSV(); var colorD:ColorHSV = new ColorHSV(); var colorE:ColorHSV = new ColorHSV(); colorE.value = color; for (var t:Number = 0.0; t < 1.0; t += s) { var tx:Number = prev.x + dx * t; var ty:Number = prev.y + dy * t; var d:int = 15; colorA.value = (tx - d < 0) ? 0xFFFFFF : bd.getPixel(tx - d, ty); colorB.value = (bd.width <= tx + d) ? 0xFFFFFF : bd.getPixel(tx + d, ty); colorC.value = (ty - d < 0) ? 0xFFFFFF : bd.getPixel(tx, ty - d); colorD.value = (bd.height <= ty + d) ? 0xFFFFFF : bd.getPixel(tx, ty + d); r = r + ((colorA.r + colorB.r + colorC.r + colorD.r) / 4 - r) * (1.0 - slider.value); g = g + ((colorA.g + colorB.g + colorC.g + colorD.g) / 4 - g) * (1.0 - slider.value); b = b + ((colorA.b + colorB.b + colorC.b + colorD.b) / 4 - b) * (1.0 - slider.value); r = r + (colorE.r - r) * DIFF; g = g + (colorE.g - g) * DIFF; b = b + (colorE.b - b) * DIFF; colorA.r = r; colorA.g = g; colorA.b = b; image.threshold(image, image.rect, new Point(), "!=", 0x0, colorA.value32, 0xFF000000); bd.copyPixels(image, image.rect, new Point(prev.x + dx * t, prev.y + dy * t)); } i++; } } } import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Rectangle; import frocessing.color.ColorHSV; class Slider extends Sprite { private var bar:Sprite; private var bd:BitmapData; public var value:Number = 0x00FF00; public function Slider() { var color:ColorHSV = new ColorHSV(); bd = new BitmapData(200, 30, false, 0xFF0000); addChild(new Bitmap(bd)); for (var x:int = 0; x < bd.width; x++) { color.h = 360 * (x / bd.width); bd.fillRect(new Rectangle(x, 0, 1, bd.height), color.value); } bar = new Sprite(); bar.graphics.beginFill(0x0); bar.graphics.moveTo(0, 30); bar.graphics.lineTo(-10, 40); bar.graphics.lineTo(10, 40); bar.graphics.endFill(); addChild(bar); bar.x = 100; onEnterFrame(); this.addEventListener(MouseEvent.CLICK, function():void { bar.x = mouseX; onEnterFrame(); } ); bar.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); } private function onMouseDown(event:MouseEvent):void { bar.startDrag(false, new Rectangle(0, 0, bd.width, 0)); var stop:Function = function():void { bar.stopDrag(); removeEventListener(Event.ENTER_FRAME, onEnterFrame); }; stage.addEventListener(Event.MOUSE_LEAVE, stop); stage.addEventListener(MouseEvent.MOUSE_UP, stop); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event = null):void { value = bd.getPixel(bar.x, 0); this.dispatchEvent(new Event(Event.CHANGE)); } } 絵の具まぜまぜ(水彩風お絵かき)