ColorTransform を知る

by tkinjo
♥1 | Line 147 | Modified 2009-05-20 23:09:27 | MIT License
play

ActionScript3 source code

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

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="465" height="465" paddingLeft="0" paddingTop="0" paddingRight="0" paddingBottom="0"
		applicationComplete="applicationCompleteHandler( event )">
	
	<mx:Script>
		<![CDATA[
			
			import flash.display.Bitmap;
			import flash.display.Loader;
			import flash.display.LoaderInfo;
			import flash.geom.ColorTransform;
			import flash.net.FileFilter;
			import flash.net.FileReference;
			import mx.controls.ColorPicker;
			import mx.controls.HSlider;
			import mx.events.EffectEvent;
			import mx.events.FlexEvent;
			
			/**
			 * ColorTransform を知る
			 */
			
			/**
			 * 画像データ
			 */
			private const IMAGE_DATA:String = "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";
			
			/**
			 * FileReference
			 */
			private var fileReference:FileReference;
			
			/**
			 * 読み込んだ画像
			 */
			private var loadedBitmap:Bitmap;
			
			/**
			 * 初期設定をします。
			 * 
			 * @param	event
			 */
			private function applicationCompleteHandler( event:Event ):void {
				
				Base64ImageLoader( IMAGE_DATA, loaderCompleteHandler );
			}
			
			/**
			 * colorTransform の設定値を変更する各 Slider の値を変更するとその値を color
			 * 
			 * @param	event
			 */
			private function colorTransformSliderChangeHandler( event:Event ):void {
				
				if ( loadedBitmap ) {
					
					// Bitmap.transform.colorTransform の値は変更できるか試してみたけどだめっぽい?
					//var colorTransformSlider:HSlider = event.currentTarget as HSlider;
					//loadedBitmap.transform.colorTransform[ colorTransformSlider.labels[ 1 ] ] = colorTransformSlider.value;
					
					setColorTransform();
				}
			}
			
			/**
			 * リセットボタンが押されたときに各スライダの値を 0 に設定します。
			 * 
			 * @param	event
			 */
			private function resetButtonDownHandler( event:FlexEvent ):void {
				
				redMultiplierHSlider.value = 1;
				greenMultiplierHSlider.value = 1;
				blueMultiplierHSlider.value = 1;
				alphaMultiplierHSlider.value = 1;
				
				redOffsetHSlider.value = 0;
				greenOffsetHSlider.value = 0;
				blueOffsetHSlider.value = 0;
				alphaOffsetHSlider.value = 0;
				
				setColorTransform();
			}
			
			/**
			 * loadedBitmap の colorTransform にコンポーネントの値を適用した ColorTransform を適用します。
			 */
			private function setColorTransform():void {
				
				if ( loadedBitmap ) {
					
					loadedBitmap.transform.colorTransform = new ColorTransform( 
							redMultiplierHSlider.value, 
							greenMultiplierHSlider.value, 
							blueMultiplierHSlider.value, 
							alphaMultiplierHSlider.value, 
							redOffsetHSlider.value, 
							greenOffsetHSlider.value, 
							blueOffsetHSlider.value, 
							alphaOffsetHSlider.value );
				}
			}
			
			/**
			 * 開くボタンが押されたときにファイル選択ダイアログボックスを表示します。
			 * 
			 * @param	event
			 */
			private function openButtonDownHandler( event:FlexEvent ):void {
				
				fileReference = new FileReference();
				fileReference.addEventListener( Event.SELECT, fileReferenceSelectHandler );
				var fileFilter:FileFilter = new FileFilter("Images (*.jpg,*.gif,*.png)", "*.jpg;*.gif;*.png");
				fileReference.browse( [ fileFilter ] );
			}
			
			/**
			 * ファイル選択ダイアログボックスでファイルが選択されるとそのファイルを読み込みます。
			 * 
			 * @param	event
			 */
			private function fileReferenceSelectHandler( event:Event ):void {
				
				fileReference.addEventListener( Event.COMPLETE, fileReferenceCompleteHandler );
				fileReference.load();
			}
			
			/**
			 * ファイルが読み込まれると imageContentHolder に画像を配置する準備をします。
			 * 
			 * @param	event
			 */
			private function fileReferenceCompleteHandler( event:Event ):void {
				
				var loader:Loader = new Loader();
				
				loader.contentLoaderInfo.addEventListener( Event.COMPLETE, loaderCompleteHandler );
				
				loader.loadBytes( fileReference.data );
			}
			
			/**
			 * imageContentHolder に画像を配置します。
			 * 
			 * @param	event
			 */
			private function loaderCompleteHandler( event:Event ):void {
				
				if ( loadedBitmap )
					imageContentHolder.removeChild( loadedBitmap );
				
				loadedBitmap = ( event.currentTarget as LoaderInfo ).content as Bitmap;
				imageContentHolder.addChild( loadedBitmap );
				
				var scale:Number = ( loadedBitmap.width > loadedBitmap.height ) ? stage.stageWidth / loadedBitmap.width : stage.stageHeight / loadedBitmap.height;
				//loadedBitmap.scaleX = scale;
				//loadedBitmap.scaleY = scale;
				imageContentHolder.x = ( stage.stageWidth - loadedBitmap.width ) / 2;
				imageContentHolder.y = ( stage.stageHeight - loadedBitmap.height ) / 2;
			}
			
			/**
			 * コンポーネントが表示されているかのフラグです。
			 */
			private var componentsVisible:Boolean = true;
			
			/**
			 * コンポーネントを隠すボタンが押されたときに呼ばれます。
			 * 
			 * @param	event
			 */
			private function componentsVisibleButtonDownHandler( event:FlexEvent ):void {
				
				componentsMove.end();
				
				if ( componentsVisible ) {
					
					componentsMove.xTo = -components.width;
					componentsVisibleButton.label = "コンポーネントを表示";
					
				} else {
					
					componentsMove.xTo = 0;
					componentsVisibleButton.label = "コンポーネントを隠す";
				}
				
				componentsMove.play();
				
				componentsVisible = !componentsVisible;
			}
			
			/**
			 * 
			 * @param	event
			 */
			private function canvasBackgroundColorPickerChangeHandler( event:Event ):void {
				
				canvas.setStyle( "backgroundColor", canvasBackgroundColorPicker.selectedColor );
			}
			
			/**
			 * Base64化された画像データを表示可能な形式に変換するクラス
			 * 
			 * 使い方 :
			 * 
			 * var complete:Function = function( event:Event ):void {
			 *         var display:DisplayObject = event.target.content as DisplayObject;
			 *         if (display != null)
			 *             addChild(display);
			 *     };
			 * 
			 * Base64ImageLoader(data, complete);
			 * 
			 */
			//package  
			//{
				import flash.display.Loader;
				import flash.events.Event;
				
				public function Base64ImageLoader( data:String, complete:Function = null ):Loader
				//function Base64ImageLoader( data:String, complete:Function = null ):Loader
				{
					
					var loader:Loader = new Loader();
					
					if( complete != null )
						loader.contentLoaderInfo.addEventListener( Event.COMPLETE, complete );
					
					loader.loadBytes( Base64toByteArray( data ) );
					
					return loader;
				}
			//}

			//package  
			//{
				import flash.utils.ByteArray;
				import mx.utils.Base64Decoder;
				
				public function Base64toByteArray( data:String ):ByteArray
				//function Base64toByteArray( data:String ):ByteArray
				{
					var byteArray:ByteArray;
					var base64Decoder:Base64Decoder;;
					
					base64Decoder = new Base64Decoder();
					base64Decoder.decode(data);
					
					try {
						byteArray = base64Decoder.toByteArray();
						byteArray.position = 0;
					} catch (e:Error) {
						return null;
					}
					
					return byteArray;
				}
			//}
			
			
		]]>
	</mx:Script>
	
	<mx:Move id="componentsMove" target="{ components }" />
	
	<mx:Canvas id="canvas" width="100%" height="100%" backgroundColor="0x9999ff">
		<mx:UIComponent id="imageContentHolder" />
		<mx:Box id="components" height="100%" verticalAlign="middle" alpha="0.9" backgroundColor="0xffffff" paddingLeft="10" paddingRight="10">
			<mx:Box horizontalAlign="center" verticalAlign="middle" alpha="1.5">
				<mx:Button id="resetButton" label="スライダーの値をリセット" buttonDown="resetButtonDownHandler( event )" />
				<mx:Spacer height="5" />
				<mx:HBox>
					<mx:VBox>
						<mx:HSlider id="redMultiplierHSlider" minimum="-1" maximum="1" value="1" labels="[ '-1','redMultiplier', '1' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:HSlider id="greenMultiplierHSlider" minimum="-1" maximum="1" value="1" labels="[ '-1','greenMultiplier', '1' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:HSlider id="blueMultiplierHSlider" minimum="-1" maximum="1" value="1" labels="[ '-1','blueMultiplier', '1' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:HSlider id="alphaMultiplierHSlider" minimum="-1" maximum="1" value="1" labels="[ '-1','alphaMultiplier', '1' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:Spacer height="5" />
						<mx:HSlider id="redOffsetHSlider" minimum="-255" maximum="255" value="0" labels="[ '-255','redOffset', '255' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:HSlider id="greenOffsetHSlider" minimum="-255" maximum="255" value="0" labels="[ '-255','greenOffset', '255' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:HSlider id="blueOffsetHSlider" minimum="-255" maximum="255" value="0" labels="[ '-255','blueOffset', '255' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
						<mx:HSlider id="alphaOffsetHSlider" minimum="-255" maximum="255" value="0" labels="[ '-255','alphaOffset', '255' ]" labelOffset="5" change="colorTransformSliderChangeHandler( event )" />
					</mx:VBox>
				</mx:HBox>
			</mx:Box>
		</mx:Box>
		<mx:HBox width="100%" alpha="0.9" backgroundColor="0xffffff" paddingLeft="2" paddingTop="2" paddingBottom="2">
			<mx:Button id="componentsVisibleButton" label="コンポーネントを隠す" buttonDown="componentsVisibleButtonDownHandler( event )" />
			<mx:Button id="openButton" label="画像を開く" buttonDown="openButtonDownHandler( event )" />
			<mx:ColorPicker id="canvasBackgroundColorPicker" selectedColor="0x9999ff" change="canvasBackgroundColorPickerChangeHandler( event )" />
		</mx:HBox>
	</mx:Canvas>
	
</mx:Application>