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

时间:2011-04-01 15:41:10

标签: flex draw bitmapdata

我正在尝试将组件保存为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>

3 个答案:

答案 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的默认填充颜色)