使用adobe flex在空中应用程序中将bmpData保存为jpg

时间:2011-12-07 17:00:47

标签: actionscript flex4 air store

我使用以下代码:

 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 个答案:

答案 0 :(得分:1)

此链接应该有所帮助: Creating images with Air and JPEG Encoder

答案 1 :(得分:1)

以下代码可以帮助您

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编码,您需要导入

import mx.graphics.codec.JPEGEncoder;

上述更改应足以让用户拍摄正在运行的视频的快照。 请注意,通过此操作,系统将提示用户选择文件的位置。 如果您想要静音保存,请告诉我,我会提供所需的代码。

答案 2 :(得分:1)

在你的应用程序的某个地方保留一个图片标签,如下所示。最适合的地方应该在视频下方。

<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中的图像“组件”,使其完成缩放视频图像的工作,然后拍摄此调整大小的图像组件的快照,然后将其写入文件。

答案 3 :(得分:0)

我最后的捕获是:

        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宽度120高度而不是BitmapData(videoDisplay.width,videoDisplay.height);我该怎么做才能解决这个问题?

非常感谢大家!