将自定义的 Sprite 保存为图像到本地磁盘
Saving customized Sprite as an image to local disk
我的 Action Script 3 代码有问题。
我要让用户在 spBoard 中绘制任何 he/she 想要的东西,然后我想让 him/her 能够将它保存在本地磁盘中。
这是代码,但此代码只能保存 spBoard,而不会被用户淹没。
import com.adobe.images.JPGEncoder;
import com.adobe.images.PNGEncoder;
var lineSize: Number = 7;
var currentColor: Number;
var spBoard: Sprite = new Sprite();
this.addChild(spBoard);
spBoard.x = 280;
spBoard.y = 23;
drawBoard();
var shDrawing: Shape = new Shape();
this.addChild(shDrawing);
shDrawing.x = 280;
shDrawing.y = 23;
var shMask: Shape = new Shape();
this.addChild(shMask);
shMask.x = 280;
shMask.y = 23;
drawMask();
shDrawing.mask = shMask;
var doDraw: Boolean = false;
function drawBoard(): void {
spBoard.graphics.lineStyle(1, 0x000000);
spBoard.graphics.beginFill(0xFFFFFF);
spBoard.graphics.drawRect(0, 0, 250, 250);
spBoard.graphics.endFill();
spBoard.filters = [new DropShadowFilter()];
}
function drawMask(): void {
shMask.graphics.lineStyle(1, 0x000000);
shMask.graphics.beginFill(0xFFFFFF);
shMask.graphics.drawRect(1, 1, 249, 249);
shMask.graphics.endFill();
}
spBoard.addEventListener(MouseEvent.MOUSE_DOWN, boardDown);
spBoard.addEventListener(MouseEvent.MOUSE_UP, boardUp);
function boardDown(e: MouseEvent): void {
var curX: Number = shDrawing.mouseX;
var curY: Number = shDrawing.mouseY;
doDraw = true;
shDrawing.graphics.lineStyle(5, 0x000066);
shDrawing.graphics.lineStyle(lineSize, currentColor);
shDrawing.graphics.moveTo(curX, curY);
}
function boardUp(e: MouseEvent): void {
doDraw = false;
}
spBoard.addEventListener(MouseEvent.MOUSE_MOVE, boardMove);
function boardMove(e: MouseEvent): void {
var curX: Number = shDrawing.mouseX;
var curY: Number = shDrawing.mouseY;
if (doDraw) {
shDrawing.graphics.lineTo(curX, curY);
}
e.updateAfterEvent();
}
save_image.addEventListener(MouseEvent.CLICK, save_image_function);
function save_image_function(event:MouseEvent):void
{
var bmd:BitmapData = new BitmapData(50,50);
bmd.draw(spBoard);
var encorder:PNGEncoder = new PNGEncoder();
var bytes:ByteArray = PNGEncoder.encode( bmd );
var file:FileReference = new FileReference();
file.save( bytes, "Image.png" );
}
您正在 shDrawing
绘图,然后保存 spBoard
!!
spBoard 还不包含任何绘制的图形!
你必须在保存之前将 Draw graphics 复制到 spBoard
sprite 中。
我还在 save function[=20] 中使用了 250x250 大小的位图数据=] 覆盖整个绘图板。
function save_image_function(event:MouseEvent):void
{
var _filters:Array = spBoard.filters;
var defaultHolder:Sprite = new Sprite();
defaultHolder.graphics.copyFrom(spBoard.graphics);
spBoard.filters = [];
spBoard.graphics.copyFrom(shDrawing.graphics);
// above lines just for getting a back up of spBoard
var bmd:BitmapData = new BitmapData(250, 250);
bmd.draw(spBoard);
var encorder:PNGEncoder = new PNGEncoder();
var bytes:ByteArray = PNGEncoder.encode( bmd );
var file:FileReference = new FileReference();
file.save( bytes, "Image.png" );
// now retrieve default spBoard to what that was before the save process
spBoard.filters = _filters;
spBoard.graphics.clear();
spBoard.graphics.copyFrom(defaultHolder.graphics);
}
我的 Action Script 3 代码有问题。 我要让用户在 spBoard 中绘制任何 he/she 想要的东西,然后我想让 him/her 能够将它保存在本地磁盘中。 这是代码,但此代码只能保存 spBoard,而不会被用户淹没。
import com.adobe.images.JPGEncoder;
import com.adobe.images.PNGEncoder;
var lineSize: Number = 7;
var currentColor: Number;
var spBoard: Sprite = new Sprite();
this.addChild(spBoard);
spBoard.x = 280;
spBoard.y = 23;
drawBoard();
var shDrawing: Shape = new Shape();
this.addChild(shDrawing);
shDrawing.x = 280;
shDrawing.y = 23;
var shMask: Shape = new Shape();
this.addChild(shMask);
shMask.x = 280;
shMask.y = 23;
drawMask();
shDrawing.mask = shMask;
var doDraw: Boolean = false;
function drawBoard(): void {
spBoard.graphics.lineStyle(1, 0x000000);
spBoard.graphics.beginFill(0xFFFFFF);
spBoard.graphics.drawRect(0, 0, 250, 250);
spBoard.graphics.endFill();
spBoard.filters = [new DropShadowFilter()];
}
function drawMask(): void {
shMask.graphics.lineStyle(1, 0x000000);
shMask.graphics.beginFill(0xFFFFFF);
shMask.graphics.drawRect(1, 1, 249, 249);
shMask.graphics.endFill();
}
spBoard.addEventListener(MouseEvent.MOUSE_DOWN, boardDown);
spBoard.addEventListener(MouseEvent.MOUSE_UP, boardUp);
function boardDown(e: MouseEvent): void {
var curX: Number = shDrawing.mouseX;
var curY: Number = shDrawing.mouseY;
doDraw = true;
shDrawing.graphics.lineStyle(5, 0x000066);
shDrawing.graphics.lineStyle(lineSize, currentColor);
shDrawing.graphics.moveTo(curX, curY);
}
function boardUp(e: MouseEvent): void {
doDraw = false;
}
spBoard.addEventListener(MouseEvent.MOUSE_MOVE, boardMove);
function boardMove(e: MouseEvent): void {
var curX: Number = shDrawing.mouseX;
var curY: Number = shDrawing.mouseY;
if (doDraw) {
shDrawing.graphics.lineTo(curX, curY);
}
e.updateAfterEvent();
}
save_image.addEventListener(MouseEvent.CLICK, save_image_function);
function save_image_function(event:MouseEvent):void
{
var bmd:BitmapData = new BitmapData(50,50);
bmd.draw(spBoard);
var encorder:PNGEncoder = new PNGEncoder();
var bytes:ByteArray = PNGEncoder.encode( bmd );
var file:FileReference = new FileReference();
file.save( bytes, "Image.png" );
}
您正在 shDrawing
绘图,然后保存 spBoard
!!
spBoard 还不包含任何绘制的图形!
你必须在保存之前将 Draw graphics 复制到 spBoard
sprite 中。
我还在 save function[=20] 中使用了 250x250 大小的位图数据=] 覆盖整个绘图板。
function save_image_function(event:MouseEvent):void
{
var _filters:Array = spBoard.filters;
var defaultHolder:Sprite = new Sprite();
defaultHolder.graphics.copyFrom(spBoard.graphics);
spBoard.filters = [];
spBoard.graphics.copyFrom(shDrawing.graphics);
// above lines just for getting a back up of spBoard
var bmd:BitmapData = new BitmapData(250, 250);
bmd.draw(spBoard);
var encorder:PNGEncoder = new PNGEncoder();
var bytes:ByteArray = PNGEncoder.encode( bmd );
var file:FileReference = new FileReference();
file.save( bytes, "Image.png" );
// now retrieve default spBoard to what that was before the save process
spBoard.filters = _filters;
spBoard.graphics.clear();
spBoard.graphics.copyFrom(defaultHolder.graphics);
}