火曜二限授業のレポート・ジェネレーター

by Mae_ITR
このデータを18枚x4セット作る課題
手作業でやってたら半端無かったので作った
急造なんでコード汚いです
♥0 | Line 409 | Modified 2009-11-25 00:38:25 | MIT License
play

ActionScript3 source code

/**
 * Copyright Mae_ITR ( http://wonderfl.net/user/Mae_ITR )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yVcK
 */

// forked from clockmaker's Green Icon Generator
// forked from alumican_net's [Sample] BoundaryResizer Demo

//このデータを18枚x4セット作る課題
//手作業でやってたら半端無かったので作った
//急造なんでコード汚いです

package 
{
	import flash.display.Sprite;
	import flash.display.BitmapData;
	import flash.events.Event;
	import flash.net.*;
	
	import com.bit101.components.*;
	import jp.progression.casts.*;
	import mx.graphics.codec.*;
	
	/**
	 * ...
	 * @author mae0510
	 */
	public class Main extends CastDocument 
	{
		private var _fr:FileReference;
		private var _loader:CastLoader;
		private var _baseimage:BaseImage;
		private var _ui:Sprite;
		private var _count:uint = 1;
		private var slider:HSlider;
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			// entry point
			
			//BaseImage
			_baseimage = new BaseImage();
			_baseimage.scaleX = _baseimage.scaleY = 0.5; 
			addChildAt(_baseimage, 0);
			
			//Loader
			_fr = new FileReference();
			_loader = new CastLoader();			
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplateHandler);
			
			//UI
			_ui = new Sprite();
			addChildAt(_ui, 1);
			new PushButton(this._ui, 10, 10, "Load Image", FileBrowseHandler);
			new PushButton(this._ui, 10, 40, "Save Image", FileSaveHandler);
			slider = new HSlider(this._ui, 120, 12.5, scaleHandler);
			new Label(this._ui, 230, 10, "Zoom Out / In");
			slider.value = _baseimage.scaleX * 100;
			
			//枠まわり
			this.graphics.lineStyle(1, 0xCCCCCC);
			this.graphics.beginFill(0xFFFFFF);
			this.graphics.drawRect(0,0,620, 877);
			this.graphics.endFill();
			
		}
		//エクスプローラーを開く
		private function FileBrowseHandler(e:Event = null):void
		{
			_fr.browse();
			_fr.addEventListener(Event.SELECT, FileSelectHandler );
		}
		//ファイルを選択する
		private function FileSelectHandler(e:Event):void 
		{
			_fr.addEventListener(Event.COMPLETE, FileLoadedHanler );
			_fr.removeEventListener(Event.SELECT, FileSelectHandler );
			_fr.load();
			
		}
		//ファイルデータのロードの完了
		private function FileLoadedHanler(e:Event = null):void 
		{
			_fr.removeEventListener(Event.COMPLETE,  FileLoadedHanler);
			_loader.loadBytes(_fr.data);
		}
		//_loaderのデータロードの完了&イメージを書き出す
		private function loadComplateHandler(e:Event):void 
		{
			trace("BitmapData Loaded");
			var bmd:BitmapData = new BitmapData(_loader.width, _loader.height);
			bmd.draw(_loader);
			_baseimage.drawImage(bmd);
		}
		//イメージを保存する
		private function FileSaveHandler(e:Event = null):void
		{
			if (!_loader.content) return;
			var capture :BitmapData = new BitmapData(1240, 1754);
			_baseimage.ui.removeAllChildren();
			capture.draw(_baseimage);
			_fr.save((new PNGEncoder()).encode(capture), "data" + _count + ".png");
			_count++;
		}
		//BaseImageの拡大縮小 ※後付け 超適当
		private function scaleHandler(e:Event = null):void
		{
			_baseimage.zoom = slider.value / 100;
			this.graphics.clear();
			this.graphics.lineStyle(1, 0xCCCCCC);
			this.graphics.beginFill(0xFFFFFF);
			this.graphics.drawRect(0, 0, 1240 * slider.value / 100, 1754 * slider.value / 100);
			this.graphics.endFill();
		}		
	}
}
	import flash.display.*;
	import flash.events.*;
	import flash.ui.*;
	import flash.geom.Rectangle;
	import flash.text.*;
	import frocessing.color.FColor;
	import jp.progression.casts.CastSprite;
	//import net.alumican.as3.geom.BoundaryResizer;

	
	/**
	 * ...
	 * @author mae0510
	 */
	class BaseImage extends CastSprite
	{
		private var _scale:Number = 0.5;
		public var ui:CastSprite;
		private var _image:CastSprite;		
		private var _pickCursor:Sprite;
		private var _picture:Bitmap;
		
		private var eventbar:ColorBar;
		private var editbars:Array;
		
		public function BaseImage() 
		{
			_image = new CastSprite();
			ui = new CastSprite();
			addChild(_image);
			addChildAt(ui, 10);
			
			drawTitle();
			
			//カラーピック時のカーソルを描く
			_pickCursor = new Sprite();
			_pickCursor.graphics.beginFill(0x111111);
			_pickCursor.graphics.drawRect(0,-10, 1.5, 20);
			_pickCursor.graphics.drawRect( -10, 0, 20, 1.5);
			_pickCursor.graphics.endFill();			
		}
		//タイトル&名前
		private function drawTitle():void
		{
			var title:TextField = new TextField();
			trace(title.type);
			title.type = TextFieldType.INPUT;
			trace(TextFieldType.INPUT);
			title.defaultTextFormat = new TextFormat("_ゴシック", 20, 0x666666);
			title.text = "タイトル/イメージ1 学籍番号 名前";
			title.x = 729;
			title.y = 1676;
			title.width = 400;
			addChildAt(title,1);
		}
		//画像データのリサイズ&表示
		public function drawImage(bmd:BitmapData):void
		{
			_image.removeAllChildren();
			ui.removeAllChildren();
			_picture = new Bitmap(bmd);
			var boundary:Rectangle = new Rectangle(204,113,830,560);
			var target:Rectangle = _picture.bitmapData.rect;
			var resized:Rectangle = BoundaryResizer.resize(target, boundary, BoundaryResizer.SHOW_ALL, BoundaryResizer.BOTTOM);
			_picture.width = resized.width;
			_picture.height = resized.height;
			_picture.x = resized.x;
			_picture.y = resized.y;
			_image.addChild(_picture);
			
			drawBars();
			
		}
		private function drawBars():void 
		{
			editbars = new Array();
			var dotcolor:Array = new Array();
			for (var i:int = 0; i <= 2; i++) {
				dotcolor[i]=_picture.bitmapData.getPixel(_picture.width*Math.random(),_picture.height*Math.random());
				var colorbar:ColorBar = new ColorBar(dotcolor[i]);
				colorbar.name = String(i);
				colorbar.x = 204 + 276 * i;
				colorbar.y = 768;
				_image.addChild(colorbar);
				colorbar.addEventListener(ColorBar.DOWN, mouswDownHandler);
				
				var colorbar2:ColorBar = new ColorBar(dotcolor[i]);
				colorbar2.name =String(i);
				colorbar2.x = 204 + 276  * i;
				colorbar2.y = 1020;
				_image.addChild(colorbar2);
				editbars[i] = colorbar2;
				colorbar2.addEventListener(ColorBar.CLICK,colorEditHandler);
			}			
		}
		
		private function colorEditHandler(e:Event):void 
		{
			var eventbar2:ColorBar =  e.currentTarget as ColorBar;
			eventbar2.removeEventListener(ColorBar.CLICK, colorEditHandler);
			var editwindow:Editer = new Editer();
			editwindow.target = eventbar2;
			editwindow.window.title =  "Color:HSV " + String(int(eventbar2.name)+1);
			editwindow.slider1.value = (eventbar2.color.h>=0)?Math.round(eventbar2.color.h / 360 * 100):Math.round((360+eventbar2.color.h) / 360 * 100);
			editwindow.slider2.value = Math.round(eventbar2.color.s * 100);
			editwindow.slider3.value = Math.round(eventbar2.color.v * 100);
			editwindow.x = stage.mouseX / _scale;
			editwindow.y = stage.mouseY / _scale;
			editwindow.width /= _scale;
			editwindow.height /= _scale;
			ui.addChild(editwindow);
			editwindow.addEventListener(Editer.CHANGE, changevalueHandler);
			editwindow.addEventListener(Editer.CLOSE, windowCloseHandler);
		}
		
		private function windowCloseHandler(e:Event):void 
		{
			ui.removeChild(e.currentTarget as Editer);
			e.currentTarget.target.addEventListener(ColorBar.CLICK,colorEditHandler);
		}
		
		private function changevalueHandler(e:Event):void 
		{
			var tempColor:FColor = new FColor();
			tempColor.hsv(	e.currentTarget.slider1.value * 360 / 100,
							e.currentTarget.slider2.value /100,
							e.currentTarget.slider3.value /100
						);
			e.currentTarget.target.draw(tempColor.value);
		}
		
		private function mouswDownHandler(e:Event):void 
		{
			Mouse.hide();
			addChild(_pickCursor);
			eventbar =  e.currentTarget as ColorBar;						
			_pickCursor.x = stage.mouseX / _scale;
			_pickCursor.y = stage.mouseY / _scale;
			addEventListener(MouseEvent.MOUSE_UP, mouseupHandler);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, colorpickHandler);
		}
		
		private function colorpickHandler(e:MouseEvent):void 
		{
			var color:uint = _picture.bitmapData.getPixel(_picture.mouseX,_picture.mouseY);
			eventbar.draw(color);
			editbars[int(eventbar.name)].draw(color);
			_pickCursor.x = stage.mouseX / _scale;
			_pickCursor.y = stage.mouseY / _scale;
		}
		
		private function mouseupHandler(e:MouseEvent):void 
		{
			Mouse.show();
			removeChild(_pickCursor);
			removeEventListener(MouseEvent.MOUSE_UP, mouseupHandler);
			stage.removeEventListener(MouseEvent.MOUSE_MOVE,colorpickHandler);
		}
		public function set zoom(scale:Number):void {
			this._scale = this.scaleX = this.scaleY = scale;
			for each(var target:Sprite in this.ui.children) {
				target.scaleX = target.scaleY = 1/scale;
			}
		}
		
		
	}
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import frocessing.color.*;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	/**
	 * ...
	 * @author mae0510
	 */
	class ColorBar  extends Sprite
	{
		public var colorbar:Sprite;
		public var color:FColor;
		private var _tfHSBs:Array;
		private var _tfRGBs:Array;
		private var th:Array = ["H", "S", "B" ];
		private var tr:Array = ["R", "G", "B" ];
		
		static public const CLICK:String = "barclick";
		static public const DOWN:String = "bardown";
		
		public function ColorBar(color:uint) 
		{
			init(color);			
		}
		
		private function init(color:uint):void
		{
			colorbar = new Sprite();
			colorbar.addEventListener(MouseEvent.CLICK, mouseclickHandler);
			colorbar.addEventListener(MouseEvent.MOUSE_DOWN,mousedownHandler);
			addChild(colorbar);
			
			_tfHSBs = new Array();
			_tfRGBs = new Array();
			var tformat:TextFormat = new TextFormat("_sans", 20, 0x666666);
			for (var i:int = 0; i <= 2; i++ ) {
				var tfHSB:TextField = new TextField();
				tfHSB.defaultTextFormat = tformat;
				tfHSB.x = 11 + i * 87;
				tfHSB.y = 63;
				addChild(tfHSB);
				_tfHSBs.push(tfHSB);
				
				var tfRGB:TextField = new TextField();
				tfRGB.defaultTextFormat = tformat;
				tfRGB.x = 11 + i * 87;
				tfRGB.y = 119;
				addChild(tfRGB);
				_tfRGBs.push(tfRGB);
			}
			
			draw(color);
			
		}

		public function draw(color:uint):void {
			drawBar(color);
			drawParam(color);
		}
		
		private function drawBar(value:uint):void
		{
			colorbar.graphics.clear();
			colorbar.graphics.beginFill(value);
			colorbar.graphics.drawRect(0, 0, 276, 14);
			colorbar.graphics.endFill();
			
		}
		
		private function drawParam(value:uint):void
		{
			color = new FColor();
			color.value = value;
			
			for (var i:int = 0; i <= 2; i++ ) {
				switch(i) {
					case 0: (color.h >= 0)?_tfHSBs[i].text = th[i] + ": " + Math.round(color.h):_tfHSBs[i].text = th[i] + ": " + Math.round(360 + color.h);
							_tfRGBs[i].text = tr[i] + ": " + color.r;
							break;
					case 1: _tfHSBs[i].text = th[i] + ": " + Math.round(color.s * 100);
							_tfRGBs[i].text = tr[i] + ": " + color.g;
							break;
					case 2: _tfHSBs[i].text = th[i] + ": " + Math.round(color.v * 100);
							_tfRGBs[i].text = tr[i] + ": " + color.b;
							break;
					default : break;
				}
			}
			
		}
				
		private function mousedownHandler(e:MouseEvent):void 
		{
			dispatchEvent(new Event(ColorBar.DOWN));
		}
		
		private function mouseclickHandler(e:MouseEvent):void 
		{
			dispatchEvent(new Event(ColorBar.CLICK));
		}
		
	}
	import com.bit101.components.*;
	import flash.display.Sprite;	
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	/**
	 * ...
	 * @author Mae0510
	 * */
	class Editer extends Sprite 
	{
		
		public var target:ColorBar;
		
		public var window:Window;
		public var slider1:HSlider;
		public var slider2:HSlider;
		public var slider3:HSlider;
		private var btn:PushButton;
		
		static public const CHANGE:String = "change";
		static public const CLOSE:String = "close";
		
		public function Editer() 
		{
			init();	
		}
		
		private function init():void
		{
			window = new Window(this, 0, 0);
			window.width = 215;
			window.height = 120;
			
			slider1 = new HSlider(window.content, 20, 10);
			slider1.addEventListener(Event.CHANGE,changevalueHandler);
			slider1.width = 180;			
			slider2 = new HSlider(window.content, 20, 30);
			slider2.addEventListener(Event.CHANGE,changevalueHandler);
			slider2.width = 180;
			slider3 = new HSlider(window.content, 20, 50);
			slider3.addEventListener(Event.CHANGE,changevalueHandler);
			slider3.width = 180;
			
			btn = new PushButton(window.content, 100, 70, "close", closeHandler);
			
			new Label(window.content, 5, 7, "H");
			new Label(window.content, 5, 27, "S");
			new Label(window.content, 5, 47, "B");
		}
		
		private function closeHandler(e:Event = null):void
		{
			dispatchEvent(new Event(Editer.CLOSE));
			//this.parent.removeChild(this);
		}
		
		private function changevalueHandler(e:Event):void 
		{
			dispatchEvent(new Event(Editer.CHANGE));
		}
		
	}
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.geom.Rectangle;
	
	/**
	 * BoundaryResizer
	 * 様々なリサイズをRectangleベースで実行するクラスです.
	 * @see http://blog.alumican.net/2009/10/07_225251
	 * @author alumican.net<Yukiya Okuda>
	 */
	class BoundaryResizer
	{
		//-------------------------------------
		//CLASS CONSTANTS
		
		/**
		 * scaleMode
		 * リサイズ方法を操作するscaleModeには以下の定数を指定できます.
		 */
		static public const EXACT_FIT:String = StageScaleMode.EXACT_FIT; // targetとboundaryが完全に一致するようにリサイズされます.多くの場合,targetの縦横比は保たれません.
		static public const SHOW_ALL:String  = StageScaleMode.SHOW_ALL;  // targetが縦横比を保ち,かつtargetがboundaryの内側にフィットするようにリサイズされます.targetがトリミングされることはありませんが,上下または左右に隙間ができることがあります.
		static public const NO_BORDER:String = StageScaleMode.NO_BORDER; // targetが縦横比を保ち,かつboundaryがtargetの内側にフィットするようにリサイズされます.targetとboundaryの間に隙間ができることはありませんが,targetがトリミングされることがあります.
		static public const NO_SCALE:String  = StageScaleMode.NO_SCALE;  // リサイズがおこなわれず,alignによる基準点合わせのみがおこなわれます.
		
		/**
		 * align
		 * リサイズ後のオブジェクトの基準点を操作するalignには以下の定数を指定できます.
		 */
		static public const TOP_LEFT:String     = StageAlign.TOP_LEFT;     // x軸方向:左  , y軸方向:上
		static public const TOP:String          = StageAlign.TOP;          // x軸方向:中央, y軸方向:上
		static public const TOP_RIGHT:String    = StageAlign.TOP_RIGHT;    // x軸方向:右  , y軸方向:上
		static public const LEFT:String         = StageAlign.LEFT;         // x軸方向:左  , y軸方向:中央
		static public const CENTER:String       = "";                      // x軸方向:中央, y軸方向:中央
		static public const RIGHT:String        = StageAlign.RIGHT;        // x軸方向:右  , y軸方向:中央
		static public const BOTTOM_LEFT:String  = StageAlign.BOTTOM_LEFT;  // x軸方向:左  , y軸方向:下
		static public const BOTTOM:String       = StageAlign.BOTTOM;       // x軸方向:中央, y軸方向:下
		static public const BOTTOM_RIGHT:String = StageAlign.BOTTOM_RIGHT; // x軸方向:右  , y軸方向:下
		
		
		
		
		
		//-------------------------------------
		//METHODS
		
		/**
		 * targetをboundaryに合わせてリサイズした矩形を返します.
		 * リサイズ方法と基準点をscaleMode,alignで指定できます.
		 * @param   target    リサイズ対象オブジェクトの矩形を指定します.(例)リサイズしたい画像の矩形
		 * @param   boundary  リサイズの基準となる矩形を指定します.(例)リサイズ後の画像を収める枠
		 * @param   scaleMode リサイズ時のスケールモードを指定します.このパラメータはStageScaleModeと互換性があります.このパラメータを省略した場合はBoundaryResizer.NO_SCALEとなり,リサイズはおこなわれません.
		 * @param   align     boundaryに対するtargetの基準位置を指定します.このパラメータはStageAlignと互換性があります.このパラメータを省略した場合はBoundaryResizer.CENTERとなり,縦横ともに中央揃えとなります.
		 * @return            リサイズ後の矩形が返されます.target及びboundaryは変更しません.
		 */
		static public function resize(target:Rectangle, boundary:Rectangle, scaleMode:String = "noScale", align:String = ""):Rectangle
		{
			var tx:Number = target.x,
			    ty:Number = target.y,
			    tw:Number = target.width,
			    th:Number = target.height,
			    bx:Number = boundary.x,
			    by:Number = boundary.y,
			    bw:Number = boundary.width,
			    bh:Number = boundary.height;
			
			switch (scaleMode)
			{
				case SHOW_ALL:
				case NO_BORDER:
					var ratioW:Number = bw / tw,
					    ratioH:Number = bh / th,
					    ratio:Number  = (scaleMode == SHOW_ALL) ? ( (ratioW < ratioH) ? ratioW : ratioH ) :
					                                              ( (ratioW > ratioH) ? ratioW : ratioH ) ;
					tw *= ratio;
					th *= ratio;
					break;
				
				case EXACT_FIT:
					return new Rectangle(bx, by, bw, bh);
			}
			
			tx = bx + ( (align == TOP_LEFT    || align == LEFT   || align == BOTTOM_LEFT ) ? 0               :
			            (align == TOP_RIGHT   || align == RIGHT  || align == BOTTOM_RIGHT) ? (bw - tw)       :
			                                                                                 (bw - tw) / 2 ) ;
			ty = by + ( (align == TOP_LEFT    || align == TOP    || align == TOP_RIGHT   ) ? 0               :
			            (align == BOTTOM_LEFT || align == BOTTOM || align == BOTTOM_RIGHT) ? (bh - th)       :
			                                                                                 (bh - th) / 2 ) ;
			
			return new Rectangle(tx, ty, tw, th);
		}
	}