我正在尝试将组件保存为JPG文件,我似乎无法让BitmapData.draw()给我我期待的像素,而是当我打开时看到一个纯白色矩形生成JPG文件。我首先创建一个包含图像和标题的对象(下面的MultigraphCanvas),当我将对象显示为弹出窗口时,它看起来很完美 - 但是当我尝试将其绘制为位图然后编码并将其保存为一个JPG我最终没有得到我可以在屏幕上显示的相同图像。这是代码:
private function saveAsFile(title:String):void
{
// make a canvas containing the multigraph and title
var multigraphCanvas:MultigraphCanvas = new MultigraphCanvas();
multigraphCanvas.initialize();
multigraphCanvas.multigraphGroup = multigraphGroup;
multigraphCanvas.titleText.text = title;
this.addElement(multigraphCanvas);
var matrix:Matrix = new Matrix()
matrix.tx = 0;
matrix.ty = 0;
var multigraphCanvasBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff);
multigraphCanvasBitmapData.draw(multigraphCanvas, matrix);
var multigraphCanvasImage:Image = new Image();
multigraphCanvasImage.load(new Bitmap(multigraphCanvasBitmapData));
multigraphCanvasImage.content.width = multigraphCanvas.width;
multigraphCanvasImage.content.height = multigraphCanvas.height;
var multigraphCanvasImageBitmapData:BitmapData = new BitmapData(multigraphCanvas.width, multigraphCanvas.height, true, 0xffffffff);
multigraphCanvasImageBitmapData.draw(multigraphCanvasImage);
// DEBUGGING
PopUpManager.addPopUp(multigraphCanvas, this);
// DEBUGGING
var debugImage:Image = new Image();
debugImage.source = multigraphCanvasImageBitmapData;
var debugTitleWindow:TitleWindow = new TitleWindow();
debugTitleWindow.addElement(debugImage);
PopUpManager.addPopUp(debugTitleWindow, this);
// encode the canvas bitmap into a JPG byte array
var jpgEncoder:JPEGEncoder = new JPEGEncoder(85);
var jpgByteArray:ByteArray = jpgEncoder.encode(multigraphCanvasImageBitmapData);
// save the JPG byte array as a file
var fileReference:FileReference = new FileReference();
fileReference.save(jpgByteArray, title + ".jpg");
}
我可以期望BitmapData.draw()方法绘制它传递的显示对象的每个组件,还是只渲染最顶层的元素而不是任何子元素(这对我来说是这样的)? / p>
答案 0 :(得分:0)
我认为组件需要位于BitmapData.draw()
的显示树中才能呈现它们。
答案 1 :(得分:0)
过去24小时我一直都在忙,所以如果功能坏了不要怪我:) 这是我所拥有的功能的精简版本,它获取容器(c1)的快照并将其发送到服务器。我是base64编码,因为这是Java人们想要的后端。您必须按摩设置以满足您的需求。我删掉了很多我在这个函数中的东西
private function getSnapShot( e:MouseEvent ):String{
var matrix:Matrix = new Matrix()
matrix.tx = 0;
matrix.ty = 0;
var finished1:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff);
finished1.draw( this.c1, matrix );
var myImage:Image = new Image();
myImage.load( new Bitmap(finished1) );
myImage.content.width = this.c1.width;
myImage.content.height = this.c1.height;
var finished:BitmapData = new BitmapData(this.c1.width,this.c1.height,true,0xffffffff);
finished.draw(myImage);
myImage = null;
var encoder:JPEGEncoder = new JPEGEncoder();
var data:ByteArray = encoder.encode(finished);
var b64:Base64Encoder = new Base64Encoder()
b64.encodeBytes( data )
return b64.toString();
}
您可能只需要返回“数据”,即JPG
答案 2 :(得分:0)
检查源显示对象容器的注册点。
让我们假设以下情况:
显示对象容器包含一个像矩形的视觉效果,此DisplayObjectContainer在左下方有注册,因此在x,y = 1,1时没有内容可用。
BitmapData.draw将复制从0,0开始的内容(如果您没有通过矩阵转换指定其他内容),那么您将获得一个空的白色区域(或BitmapData的默认填充颜色)