0

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

4

3 回答 3

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

于 2011-04-01T16:21:42.173 回答
0

检查源显示对象容器的注册点。

让我们想象以下场景:

显示对象容器包含一个类似矩形的视觉对象,并且此 DisplayObjectContainer 在左下角注册,因此在 x,y = 1,1 处没有可用的内容。

BitmapData.draw 将从 0,0 开始复制内容(如果您没有通过矩阵转换另行指定),因此您将获得一个空白区域(或 BitmapData 的默认填充颜色)

于 2011-10-27T09:04:50.243 回答
0

我相信组件需要在显示树中BitmapData.draw()才能呈现它们。

于 2011-04-01T16:05:00.443 回答