Flex BitmapData.draw () рисует только белый прямоугольник - могу ли я нарисовать все элементы экранного объекта? - PullRequest
0 голосов
/ 01 апреля 2011

Я пытаюсь сохранить компонент в виде файла 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 () будет рисовать каждый компонент экранного объекта, который он передал, или он просто отображает самый верхний элемент и ни один из дочерних элементов (этоэто как у меня выглядит)?

Ответы [ 3 ]

0 голосов
/ 01 апреля 2011

Я был в течение последних 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

0 голосов
/ 27 октября 2011

Проверьте точку регистрации исходного контейнера экранного объекта.

Давайте представим следующий сценарий:

Контейнер экранного объекта содержит визуал, похожий на прямоугольник, и этот DisplayObjectContainer имеет регистрацию в левом нижнем углу, поэтому контент не доступен при x, y = 1,1.

BitmapData.draw скопирует содержимое, начиная с 0,0 (если вы не укажете иное с помощью перевода матрицы), так что вы получите пустую белую область (или цвет заливки по умолчанию для BitmapData)

0 голосов
/ 01 апреля 2011

Я считаю, что компоненты должны быть в дереве отображения для BitmapData.draw(), чтобы иметь возможность их визуализировать.

...