сделать снимок видимой области экранного объекта во флэш-памяти

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

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

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

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

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

Спасибо


person Primoz Rome    schedule 28.07.2011    source источник


Ответы (3)


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

вот код одной из моих программ, которая сохраняет .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)

person Chunky Chunk    schedule 28.07.2011
comment
+1 упоминание as3corelib. Фантастическая библиотека, которая кажется заниженной - person Chris; 28.07.2011

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

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

person Timofei Davydik    schedule 28.07.2011
comment
Работает ли clipRect так же, как Matrix для установки начала координат, где рисовать, или он использует только ширину / высоту прямоугольника для рисования от 0,0? Не могу припомнить, что я был под впечатлением от того, чтобы нарисовать конкретную в точке, где вам нужна была матрица перевода в качестве параметра рисования. - person ; 28.07.2011

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

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

person leafcutter    schedule 20.08.2011