forked from: BitmapDataの大きさを、指定の枠の大きさに合わせるサンプル
元画像のアスペクト比を無視して 300 * 300 に表示させるのではなく、
* アスペクト比を変えずに、縦横のうち大きい方の値が 300 ピクセルを超えないよう拡大縮小するなら、
* BitmapData.draw() の第2引数 matrix を使った方が簡単ではないかと思い、fork してみました。
// forked from Hiiragi's BitmapDataの大きさを、指定の枠の大きさに合わせるサンプル
/*
* 元画像のアスペクト比を無視して 300 * 300 に表示させるのではなく、
* アスペクト比を変えずに、縦横のうち大きい方の値が 300 ピクセルを超えないよう拡大縮小するなら、
* BitmapData.draw() の第2引数 matrix を使った方が簡単ではないかと思い、fork してみました。
*/
package
{
import flash.display.*;
import flash.events.*;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.net.FileReference;
import com.bit101.components.PushButton;
import com.bit101.components.Text;
/**
* BitmapDataの大きさを、指定の枠の大きさに合わせるサンプル
*
* この場合は300*300の枠に合わせて拡大・縮小します。
* loadImageボタンを押して、いろんな大きさの画像ファイルを読み込んでみてください。
*
* ただし、全体のピクセルが16,777,216ピクセル以下の画像に限ります。
* これより大きくなるとエラーが出ます。多分。
*
* drawTrianglesとかは今後の投稿の布石です。多分。
*
* @author Hiiragi
*/
[SWF(width = 465, height = 465, frameRate = 30, backgroundColor = 0)]
public class Main extends Sprite
{
private var _scenes:Vector.<Sprite>;
private var _fr:FileReference;
private var _loader:Loader;
private var _enemyImage:BitmapData;
private var _enemyBitmap:Bitmap;
private var _enemyImageMax:int = 300;
private var textComp:Text;
public function Main():void
{
_fr = new FileReference();
_loader = new Loader();
_fr.addEventListener(Event.SELECT, fileSelectedHandler);
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
//枠
var frame:Sprite = new Sprite();
frame.graphics.lineStyle(2, 0xFFFFFF);
frame.graphics.drawRect(0, 0, _enemyImageMax, _enemyImageMax);
frame.x = this.stage.stageWidth / 2 - frame.width / 2;
frame.y = this.stage.stageHeight / 2 - frame.height / 2;
this.addChild(frame);
//LoadButton
var loadBtn:PushButton = new PushButton(this, 0, 0, "load Image", loadBrowse);
// サイズ表示用 Text
textComp = new Text(this, 0, 431);
textComp.width = 465;
textComp.height = 34;
// Bitmap
_enemyBitmap = new Bitmap();
_enemyBitmap.smoothing = true;
addChild(_enemyBitmap);
}
private function loadBrowse(e:MouseEvent):void
{
_fr.browse();
}
private function fileSelectedHandler(e:Event):void
{
_fr.addEventListener(ProgressEvent.PROGRESS,onProgress);
_fr.addEventListener(Event.COMPLETE,onComplete);
// _fr.addEventListener(Event.OPEN, onOpen);
// _fr.addEventListener(IOErrorEvent.IO_ERROR, onIoError);
_fr.load(); // 読み込み処理を開始
}
private function onProgress(e:ProgressEvent):void
{
trace("読み込んだバイト数:" + e.bytesLoaded + "、 全体のバイト数:" + e.bytesTotal);
}
private function onComplete(e:Event):void
{
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoadComplete);
_loader.loadBytes(_fr.data);
// fr.type を参考にオブジェクト変換する等の処理を記述
// fr.removeEventListener(...)
}
private function imgLoadComplete(e:Event):void
{
trace("enemyImage Load Completed");
var image:BitmapData = Bitmap(_loader.content).bitmapData;
var orgWidth:uint = image.width;
var orgHeight:uint = image.height;
var scale:Number = _enemyImageMax / Math.max(orgWidth, orgHeight);
if (_enemyImage) _enemyImage.dispose();
_enemyImage = new BitmapData(orgWidth * scale, orgHeight * scale);
_enemyImage.draw(image, new Matrix(scale, 0, 0, scale));
_enemyBitmap.bitmapData = _enemyImage;
_enemyBitmap.x = (stage.stageWidth - _enemyBitmap.width) / 2;
_enemyBitmap.y = (stage.stageHeight - _enemyBitmap.height) / 2;
textComp.text = "original image width:" + orgWidth + ", original image height:" + orgHeight + "\ntransformed iamge width:" + _enemyImage.width + ", transformed image height:" + _enemyImage.height;
}
}
}