Apache flex Flex BitmapData.draw()只绘制一个白色矩形——我可以绘制显示对象的所有元素吗?

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

我试图将一个组件保存为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()方法绘制它所传递的显示对象的每个组件,还是只渲染最顶层的元素而不渲染任何子元素(这在我看来是这样的)?

我认为组件需要位于
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对象。然后把容器拉进去。然后将位图数据加载到图像对象中。最后,按照你喜欢的方式对它进行编码。哦,是的,你忘记了你需要从你刚刚创建的图像对象中创建第二个位图数据。这是你缺少的关键部分