сделать снимок видимой области экранного объекта во вспышке - PullRequest
5 голосов
/ 28 июля 2011

У меня есть приложение ввода камеры во флэш-памяти (AS3), и я рисую поверх него графику. Я хочу сделать снимок видимой области сцены, но только видео и графику, которую я рисую поверх видео. Я хочу исключить элементы управления из снимка изображения. Расположение моего экранного объекта находится в следующем соотношении:

-stage
 --canvas (Sprite)
  ---video (Video)
  ---overlayed graphics (Sprites, MCs, Shapes)
 --controls (Buttons)

Размер рабочей области фиксирован, и я хочу сделать снимок всего, что является дочерним элементом моего элемента canvas (видео с камеры и наложенная графика, но без элементов управления). Я могу сделать снимок этого изображения, когда оверлейная графика находится в пределах размера сцены. Я делаю это так:

var bmpd:BitmapData = new BitmapData(canvas.width, canvas.height);
bmpd.draw(canvas, new Matrix(1, 0, 0, 1, canvas.x, canvas.y));

Но это дает мне нежелательный результат, когда графика, которую я рисую поверх видео на холсте, выходит за границы области отображения сцены. Как ограничить снимок изображения только в пределах видимой области внутри сцены?

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

В прошлом я использовал as3corelib , который содержит классы кодировщика как для JPG ( JPGEncoder.as ), так и для PNG ( PNGEncoder.as *). 1006 *) файлы изображений. эти классы позволяют легко создавать файлы изображений из ваших экранных объектов.

вот код одной из моих программ, которая сохраняет .png всей моей сцены и всех ее дочерних элементов на локальный диск с помощью FileReference.

//Save Canvas Snapshot
private function saveCanvasSnapshot():void
    {
    var bitmapData:BitmapData = new BitmapData(DropSwatch.controller.stage.stageWidth, DropSwatch.controller.stage.stageHeight);
    bitmapData.draw(DropSwatch.controller);
    var file:ByteArray = PNGEncoder.encode(bitmapData);

    var fileReference:FileReference = new FileReference();
    fileReference.save(file, "DropSwatchCanvas.png");
    }

в вашем случае, так как вы хотите, чтобы все ваши слои, кроме элементов управления, могли просто сделать слой элементов управления невидимым при рисовании biamapData и сделать их вновь появляющимися впоследствии. затем закодируйте ваши bitmapData с помощью PNGEncoder (или JPGEncoder), назначьте их ByteArray и сохраните byteArray как .png (или .jpg)

0 голосов
/ 21 августа 2011

bitmapData.copyPixels () позволит вам получить прямоугольник пикселей в bmpd.

Это два шага, чтобы сделать то, что, я уверен, clipRectangle в рисовании сделает за один шаг, но у меня было именно этопроблема вчера, и я не смог заставить clipRectangle работать должным образом, поэтому я просто прибегнул к этому.

0 голосов
/ 28 июля 2011

draw (источник: IBitmapDrawable, matrix: Matrix = null, colorTransform: flash.geom: ColorTransform = null, blendMode: String = null, clipRect: Rectangle = null , сглаживание: Boolean =false): void

Установить параметр clipRect в соответствии с размером холста (ширина и высота равны ширине и высоте холста).

...