сохранить bmpData в формате jpg, используя Adobe Flex в приложении Air - PullRequest
1 голос
/ 07 декабря 2011

я использую следующий код:

 protected function videoDisplay_playheadUpdateHandler(event:mx.events.VideoEvent):void
 {
    if(!captured && videoDisplay.playheadTime>=0){
    capture();
    }           
 }

 private function capture():void
 {

            var bmpData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height);
            bmpData.draw(videoDisplay);

            captured = true;
            store(...); //????????


 }

для захвата кадра из объекта videoDisplay 1) это правильно или я что-то не так делаю? 2) что я могу сделать, чтобы сохранить bmpData как .jpg на моем компьютере?

Я использую flex4.5, и это приложение для воздуха ...

есть идеи ??

Заранее спасибо !!

Ответы [ 4 ]

1 голос
/ 09 декабря 2011

Где-то в вашем приложении сохраните тег изображения следующим образом. Самое подходящее место должно быть чуть ниже видео.

<mx:Image scaleContent="true" width="150" height="120" maintainAspectRatio="false" id="myScaledSnapshot"/>

Теперь, сделав это, внесите следующие изменения в ваш код:

private function capture(filename:String):void
    {   
        var bitmapData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height);            
        bitmapData.draw(videoDisplay,new Matrix());

        var bitmap : Bitmap = new Bitmap(bitmapData);
        var jpg:JPEGEncoder = new JPEGEncoder();
        var ba:ByteArray = jpg.encode(bitmapData);

        myImageSnapshot.source=ba;
        var jpegEncoder:JPEGEncoder = new JPEGEncoder(50);
        var imageSnapshot:ImageSnapshot = ImageSnapshot.captureImage(this.myImageSnapshot,90,jpegEncoder);
        var imageByteArray:ByteArray = imageSnapshot.data;

        var newImage:File = File.desktopDirectory.resolvePath("KioskThumbs/"+filename+".jpg");

        fileStream = new FileStream();
        fileStream.open(newImage, FileMode.UPDATE);
        fileStream.writeBytes(imageByteArray);
        fileStream.close();
        captured = true;

    }   

Приведенный выше код действительно не делает ничего особенного. Он просто использует «компонент» изображения из flex, заставляя его выполнять работу по масштабированию видеоизображения, затем делать снимок этого компонента с измененным размером изображения и записывать его в файл.

1 голос
/ 08 декабря 2011

Следующий код должен помочь вам

var jpegEncoder:JPEGEncoder = new JPEGEncoder(90);
var jpgSource:BitmapData = new BitmapData(videoDisplay.width,videoDisplay.height);
jpgSource.draw(this);
var fileReference:FileReference =  new FileReference();
fileReference.save(jpegEncoder.encode(jpgSource),"videoImage.jpg");

Чтобы использовать jpeg encode, вам необходимо импортировать

import mx.graphics.codec.JPEGEncoder;

вышеуказанных изменений должно быть достаточно, чтобы позволить пользователю сделать снимок запущенного видео.Обратите внимание, что при этом пользователю будет предложено выбрать местоположение файла.Если вы хотите сохранить в тихом режиме, дайте мне знать, я поставлю необходимый код.

1 голос
/ 07 декабря 2011
0 голосов
/ 09 декабря 2011

Наконец-то мой снимок:

        private function capture(filename:String):void
        {   
            var bitmapData:BitmapData = new BitmapData(videoDisplay.width, videoDisplay.height);            
            bitmapData.draw(videoDisplay,new Matrix());

            var bitmap : Bitmap = new Bitmap(bitmapData);
            var jpg:JPEGEncoder = new JPEGEncoder();
            var ba:ByteArray = jpg.encode(bitmapData);
            var newImage:File = File.desktopDirectory.resolvePath("KioskThumbs/"+filename+".jpg");

            fileStream = new FileStream();
            fileStream.open(newImage, FileMode.UPDATE);
            fileStream.writeBytes(ba);
            fileStream.close();
            captured = true;

        }   

он работает нормально, за исключением того факта, что я хочу масштабировать фотографию, скажем, до 150 width 120height, а не BitmapData (videoDisplay.width, videoDisplay.height);что я могу сделать, чтобы решить это?

Большое спасибо всем вам!

...