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");
}
}
}
| 固定リンク | コメント (0) | トラックバック (1)

最近のコメント