0

我创建了一个可以使用 as3 绘图 api 绘制形状的应用程序。现在我想将这些图纸保存到本地磁盘,然后稍后打开文件进行进一步编辑。

我怎样才能做到这一点 ??将绘制的对象转换为位图可以吗?如果我将我的电影剪辑转换为位图,我会失去任何质量或其他东西......??或者有没有其他方法可以做我想要实现的目标。

此外,我不想将图纸转换为 jpeg 或任何其他图像格式。

提前致谢 :)

4

2 回答 2

5

看看 readGraphicsData():

在 Flash Player 11.6 和 Adob​​e AIR 3.6 及更高版本中,您可以使用 Graphics 类的 readGraphicsData() 方法来获取显示对象的矢量图形内容的数据表示。这可用于创建图形的快照以保存、复制、在运行时创建 spritesheet 等。

调用 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

于 2013-05-12T11:04:10.270 回答
1

这是一个关于如何保存形状数据并将其重新加载的工作示例。

为了让它更短,我使用了 SharedObject,但它与使用FileStream.writeObjectSharedObject 的过程相同。

//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();
}
于 2016-01-29T18:49:28.770 回答