FlashPlayer10 ローカルの画像を読み込み→カスタムフィルタ→別名保存
今度はローカルの画像を読み込んでみます。
読み込むまではテキストファイルの時と一緒。
違うのは読み込んだ後、Loader.loadBytes()でByteArrayから読み込まないといけないってことです。
そのLoaderインスタンスをaddChildしてあげればOKです。
これだけだとあれなので、PixelBenderで作成したカスタムフィルタをかけてみます。
前に作ったセピア色に変換するやつです。
カスタムフィルタをかけるのは前と変わらず。
まず読み込んだ画像と同じ大きさのBitmapDataを作成しておきます。
それにdrawしてapplyFilterでフィルタをかけます。
ここで注意。
こちらにも書かれてますが、loadBytesで読み込んだ直後はwidth、heightを取得できません。
Loader.contentLoaderInfoでEvent.INITが呼ばれた後は取得できるようです。
次に保存ですが、このままだと保存できません。
「JPGEncoder」を使ってBitmapDataをByteArrayに変換してあげます。
それをFileReferenceのsave()に渡してあげればOKです。
やっぱり存在しているファイルに上書きするとIOErrorになるけど。。
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.Sprite; import flash.net.FileReference; import flash.events.*; import flash.display.Shader; import flash.filters.ShaderFilter; import flash.geom.Point; import flash.utils.ByteArray; import com.adobe.images.JPGEncoder; public class Main extends Sprite { [Embed(source = "test03.pbj", mimeType = "application/octet-stream")] private var shaderData:Class; private var ld:Loader; public function Main() { //読み込みボタン var bd1:BitmapData = new BitmapData(120, 60, false, 0xFF6600); var bm1:Bitmap = new Bitmap(bd1); var mc1:Sprite = new Sprite(); mc1.addChild(bm1); mc1.x = 20; mc1.y = 20; addChild(mc1); mc1.buttonMode = true; mc1.addEventListener(MouseEvent.CLICK, selectFile); } private function selectFile(e:MouseEvent):void { //読み込むファイルの選択 var ff:FileReference = new FileReference(); ff.addEventListener(Event.SELECT, loadFile); ff.browse(); } private function loadFile(e:Event):void { //ファイル読み込み var ff:FileReference = FileReference(e.target); ff.addEventListener(Event.OPEN, function(e:Event):void { trace("open"); } ); ff.addEventListener(ProgressEvent.PROGRESS, function(e:ProgressEvent):void { trace("progress"); } ); ff.addEventListener(Event.COMPLETE, setImage ); ff.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):void { trace("ioError"); } ); ff.load(); } private function setImage(e:Event):void { //ByteArrayに読み込まれたデータをLoaderで読み込み ld = new Loader(); ld.loadBytes(e.target.data); addChild(ld); //読み込んだ画像を表示 ld.contentLoaderInfo.addEventListener(Event.INIT,initImage); } private function initImage(e:Event):void { //読み込んだ画像にカスタムフィルタ(セピア)をかける var shader:Shader = new Shader(ByteArray(new shaderData())); var shaderFilter:ShaderFilter = new ShaderFilter(shader); var bd:BitmapData = new BitmapData(ld.width, ld.height); var bm:Bitmap = new Bitmap(bd); bm.x = ld.width; bd.draw(ld); bd.applyFilter(bd, bd.rect, new Point(), shaderFilter); addChild(bm); //カスタムフィルタをかけた画像を表示 //JPGEncoderでBitmapDataをByteArrayに変換 var jpgEncoder:JPGEncoder = new JPGEncoder(85); var jpgStream:ByteArray = jpgEncoder.encode(bd); saveImage(jpgStream); } private function saveImage(ba:ByteArray):void { //保存 var ff:FileReference = new FileReference(); ff.addEventListener(Event.OPEN, function(e:Event):void { trace("open"); } ); ff.addEventListener(ProgressEvent.PROGRESS, function(e:ProgressEvent):void { trace("progress"); } ); ff.addEventListener(Event.COMPLETE, function(e:Event):void { trace("complete"); } ); ff.addEventListener(Event.CANCEL, function(e:Event):void { trace("cancel"); } ); ff.addEventListener(Event.SELECT, function(e:Event):void { trace("select"); } ); ff.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):void { trace("ioError"); } ); ff.save(ba,"newImage.jpg"); } } }
| 固定リンク
この記事へのコメントは終了しました。
コメント