as3 描画 API を使用して図形を描画できるアプリケーションを作成しました。これらの図面をローカル ディスクに保存し、後でファイルを開いてさらに編集したいと考えています。
どうやってやるの ??描画されたオブジェクトをビットマップに変換することはできますか?? ムービー クリップをビットマップに変換すると、品質や何かが失われますか?? または、私が達成したいことを行う他の方法はありますか。
また、図面を jpeg やその他の画像形式に変換したくありません。
前もって感謝します :)
as3 描画 API を使用して図形を描画できるアプリケーションを作成しました。これらの図面をローカル ディスクに保存し、後でファイルを開いてさらに編集したいと考えています。
どうやってやるの ??描画されたオブジェクトをビットマップに変換することはできますか?? ムービー クリップをビットマップに変換すると、品質や何かが失われますか?? または、私が達成したいことを行う他の方法はありますか。
また、図面を jpeg やその他の画像形式に変換したくありません。
前もって感謝します :)
readGraphicsData() を見てください:
Flash Player 11.6 および Adobe AIR 3.6 以降では、Graphics クラスの readGraphicsData() メソッドを使用して、表示オブジェクトのベクター グラフィックス コンテンツのデータ表現を取得できます。これを使用して、グラフィックのスナップショットを作成し、保存、コピー、実行時のスプライトシートの作成などを行うことができます。
readGraphicsData() メソッドを呼び出すと、IGraphicsData オブジェクトを含む Vector インスタンスが返されます。これらは、 drawGraphicsData() メソッドでベクター グラフィックスを描画するために使用されるオブジェクトと同じです。
ソース: http://help.adobe.com/en_US/as3/dev/WS749610B4-4709-4f75-BBA0-650BF52623CA.html
readGraphicsData()およびdrawGraphicsData( )のドキュメントは次のとおりです。
また、ここで例といくつかの議論を見ることができます: http://www.bytearray.org/?p=5013
シェイプ データを保存して再度読み込む方法の実際の例を次に示します。
短くするために、SharedObject を使用していますが、FileStream.writeObject
SharedObject の代わりに使用するプロセスは同じです。
//These are all the classes potentially used by Graphics:
import flash.display.GraphicsBitmapFill;
import flash.display.IGraphicsData;
import flash.geom.Matrix;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;
import flash.utils.ByteArray;
import flash.geom.ColorTransform;
import flash.filters.BitmapFilter;
import flash.geom.Vector3D;
import flash.display.GraphicsEndFill;
import flash.display.GraphicsGradientFill;
import flash.display.GraphicsPath;
import flash.display.GraphicsShaderFill;
import flash.display.Shader;
import flash.display.ShaderData;
import flash.display.GraphicsSolidFill;
import flash.display.GraphicsStroke;
import flash.display.GraphicsTrianglePath;
//an object to draw to:
var mySprite:Sprite = new Sprite();
addChild(mySprite);
//to automatically serialize the graphics, we need to register all classes involved
registerClassAlias("flash.display.IGraphicsData", IGraphicsData);
registerClassAlias("flash.display.GraphicsBitmapFill", GraphicsBitmapFill);
registerClassAlias("flash.geom.Matrix", Matrix);
registerClassAlias("flash.display.BitmapData", BitmapData);
registerClassAlias("flash.geom.Rectangle", Rectangle);
registerClassAlias("flash.geom.Point", Point);
registerClassAlias("flash.utils.ByteArray", ByteArray);
registerClassAlias("flash.geom.ColorTransform", ColorTransform);
registerClassAlias("flash.filters.BitmapFilter", BitmapFilter);
registerClassAlias("flash.geom.Vector3D", Vector3D);
registerClassAlias("flash.display.GraphicsEndFill", GraphicsEndFill);
registerClassAlias("flash.display.GraphicsGradientFill", GraphicsGradientFill);
registerClassAlias("flash.display.GraphicsPath", GraphicsPath);
registerClassAlias("flash.display.GraphicsShaderFill", GraphicsShaderFill);
registerClassAlias("flash.display.Shader", Shader);
registerClassAlias("flash.display.ShaderData", ShaderData);
registerClassAlias("flash.display.GraphicsSolidFill", GraphicsSolidFill);
registerClassAlias("flash.display.GraphicsStroke", GraphicsStroke);
registerClassAlias("flash.display.GraphicsTrianglePath", GraphicsTrianglePath);
//shared object to use
var so:SharedObject = SharedObject.getLocal("myShapes");
//check if the shared object already has data
if (so.data && so.data.shapes) {
try{
//load the existing shape data into our sprite
mySprite.graphics.drawGraphicsData(so.data.shapes);
}catch(err){
trace(err.toString());
}
}
stage.addEventListener(MouseEvent.CLICK, clicky);
function clicky(e:Event):void {
//let's draw a random circle
mySprite.graphics.beginFill(0xFFFFFF * Math.random(), Math.random());
mySprite.graphics.drawCircle(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight, Math.random() * 500);
mySprite.graphics.endFill();
//let's update the shared object to reflect our updated graphics
so.data.shapes = mySprite.graphics.readGraphicsData();
so.flush();
}