【问题标题】:AS3 ios cameraUI save and load image fails, why?AS3 ios cameraUI 保存和加载图片失败,为什么?
【发布时间】:2012-12-31 17:08:20
【问题描述】:

我正在使用下面的 AS3 代码通过 cameraUI 拍照。在 Android 上一切正常,但是当我在 iPad 上测试时,尝试加载保存的图像时出现错误。 ioErrorHandler1 返回:

ioErrorHandler: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2124: Loaded file is an unknown type. URL: app-storage:/myImage.jpg" errorID=2124]

有人知道为什么吗? (如前所述,它适用于 Android)。代码如下:

      function imageCaptured( event:MediaEvent ):void
      {
           trace( "Media captured..." );
            var imagePromise:MediaPromise = event.data;
           dataSource = imagePromise.open();    
           if( imagePromise.isAsync )
           {
            trace( "Asynchronous media promise." );

            eventSource = dataSource as IEventDispatcher; 
            imageLoader = new Loader();
            imageLoader.contentLoaderInfo.addEventListener( Event.COMPLETE, asyncImageLoaded );
            imageLoader.addEventListener( IOErrorEvent.IO_ERROR, cameraError );

                 imageLoader.loadFilePromise( imagePromise );
           }
           else
           {
            trace( "Synchronous media promise." );
            imageLoader.loadFilePromise( imagePromise );
            showMedia( imageLoader );
           }
      }
    function asyncImageLoaded( event:Event ):void
      {

            readMediaData();

      }
    function readMediaData():void
    {

var image:Bitmap = Bitmap(imageLoader.content);
var bitmap:BitmapData = image.bitmapData;

image.width = 100;
image.height = 100;
this.addChild(image);

var imageBytes:ByteArray = new ByteArray();
dataSource.readBytes( imageBytes );

var file:File = File.applicationStorageDirectory.resolvePath("myImage.jpg");
// create a file stream
var fs:FileStream=new FileStream();
// open the stream for writting
fs.openAsync(file, FileMode.WRITE);
// write the string data down to the file
fs.writeBytes(imageBytes);
// ok close the file stream
fs.close();

fs.addEventListener(Event.CLOSE,function(event:Event):void {
    var mLoader=new Loader();
    var mRequest:URLRequest = new URLRequest(file.url);
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (event:Event):void{
                                showMediaLoad(mLoader);
                        });
    mLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler1);
    mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
    mLoader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    mLoader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);

    mLoader.load(mRequest);

})

trace("saved");

    }

【问题讨论】:

    标签: ios actionscript-3 flash


    【解决方案1】:

    您可能需要在将 ByteArray 保存为 jpeg 之前对其进行编码。

    这是我不久前使用的一段代码...

    import com.adobe.images.JPGEncoder;
    
    private var f:File;
    private var stream:FileStream;
    private var j:JPGEncoder;
    private var image:Bitmap = Bitmap(imageLoader.content);
    private var urlRequest:URLRequest;
    private var loader:Loader;
    
    function saveImage():void {
    
    f = File.documentsDirectory.resolvePath("logo.jpg"); 
    
    stream = new FileStream();
    stream.open(f, FileMode.WRITE);                                         
    
    j = new JPGEncoder(80);
    var bytes:ByteArray = j.encode(image.bitmapData);
    stream.writeBytes(bytes, 0, bytes.bytesAvailable);
    stream.close();
    
    stream.openAsync(f, FileMode.READ); 
    stream.addEventListener(Event.COMPLETE, loadImage, false, 0, true); 
    }
    
    
    
    private function loadImage(e:Event):void {
    
    stream.removeEventListener(Event.COMPLETE, loadImage);
    stream = null;
    
    //now load the image
    
    if (f.exists == true) {
    
    urlRequest = new URLRequest(f.url);
    loader = new Loader;
    loader.load(urlRequest);
    loader.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):void{ trace(e) });
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, ImageLoaded, false, 0, true);
    
    }
    }
    
    private function ImageLoaded(e:Event):void {
    
    addChild(loader);
    loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, ImageLoaded);
    }
    

    【讨论】:

    • 是的,它在使用 jpg 编码器时可以工作,谢谢!唯一的问题是它非常慢。保存部分需要很长时间。你知道为什么吗?我觉得奇怪的是,我的代码在 iPad 上运行时却在 Android 上运行。
    • 我想这是花费时间的编码,而不是实际的保存。或许正在寻找更有效的编码方法?
    【解决方案2】:

    我找到了解决方案。如果我在 eventSource 上放置一个事件监听器,它可以在没有 jpgencoder 的情况下工作。如果其他人可以使用该解决方案,我将其发布在这里:

    imageCaptured 函数更新如下:

         if( imagePromise.isAsync )
               {
                trace( "Asynchronous media promise." );
                var eventSource:IEventDispatcher = dataSource as IEventDispatcher;
        eventSource.addEventListener( Event.COMPLETE, onMediaLoaded );
    
    
               }
    

    然后图像保存在这个函数中:

    function onMediaLoaded( event:Event ):void
    {
    trace("Media load complete");
    
    var imageBytes:ByteArray = new ByteArray();
    dataSource.readBytes( imageBytes );
    
    var file:File = File.applicationStorageDirectory.resolvePath("myImage.jpg");
    // create a file stream
    var fs:FileStream=new FileStream();
    // open the stream for writting
    fs.openAsync(file, FileMode.WRITE);
    // write the string data down to the file
    //fs.writeBytes(imageBytes);
    fs.writeBytes(imageBytes);
    
    // ok close the file stream
    fs.close();
    
    fs.addEventListener(Event.CLOSE, function(e:Event):void {
    
        var mLoader=new Loader();
        var mRequest:URLRequest = new URLRequest(file.url);
        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (event:Event):void{
      showMediaLoad(mLoader);
    
     });
    mLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler1);
    mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
    mLoader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    mLoader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
    
    mLoader.load(mRequest);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多