Apache flex Flex BitmapData.draw()只绘制一个白色矩形——我可以绘制显示对象的所有元素吗?
我试图将一个组件保存为JPG文件,但似乎无法获取BitmapData.draw()来提供我期望的像素,相反,当我打开生成的JPG文件时,我看到了一个纯白色的矩形。我首先创建一个包含图像和标题的对象(下面的MultigraphCanvas),当我将该对象显示为弹出窗口时,它看起来非常完美——但是当我尝试将其绘制为位图,然后将其编码并保存为JPG时,我不会得到可以在屏幕上显示的相同图像。代码如下:Apache flex Flex BitmapData.draw()只绘制一个白色矩形——我可以绘制显示对象的所有元素吗?,apache-flex,draw,bitmapdata,Apache Flex,Draw,Bitmapdata,我试图将一个组件保存为JPG文件,但似乎无法获取BitmapData.draw()来提供我期望的像素,相反,当我打开生成的JPG文件时,我看到了一个纯白色的矩形。我首先创建一个包含图像和标题的对象(下面的MultigraphCanvas),当我将该对象显示为弹出窗口时,它看起来非常完美——但是当我尝试将其绘制为位图,然后将其编码并保存为JPG时,我不会得到可以在屏幕上显示的相同图像。代码如下: private function saveAsFile(title:String):v
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()方法绘制它所传递的显示对象的每个组件,还是只渲染最顶层的元素而不渲染任何子元素(这在我看来是这样的)?我认为组件需要位于
BitmapData.draw()的显示树中
以便能够渲染它们。我已经起床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,检查源显示对象容器的注册点 让我们设想以下场景: 显示对象容器包含一个类似矩形的可视对象,此DisplayObjectContainer在左下角具有注册,因此在x,y=1,1处没有可用的内容
BitmapData.draw将从0,0开始复制内容(如果您没有通过矩阵转换进行其他指定),因此您将获得一个空白区域(或BitmapData的默认填充颜色)如何将它们放入显示树中?将组件添加为显示对象的组件的子元素或元素?基本上,您需要创建一个大小为所需的bitmapData对象。然后把容器拉进去。然后将位图数据加载到图像对象中。最后,按照你喜欢的方式对它进行编码。哦,是的,你忘记了你需要从你刚刚创建的图像对象中创建第二个位图数据。这是你缺少的关键部分