1

以下のAS3コードを使用して、cameraUIを介して写真を撮ります。Androidではすべて正常に動作しますが、iPadでテストすると、保存した画像を読み込もうとするとエラーが発生します。ioErrorHandler1は以下を返します。

ioErrorHandler:[IOErrorEvent type = "ioError"bubbles = false cancelable = false eventPhase = 2 text = "Error#2124:ロードされたファイルは不明なタイプです。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");

    }
4

2 に答える 2

0

私は解決策を見つけました。eventSourceにeventlistenerを配置すると、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);
}
于 2013-01-19T12:19:14.433 に答える
0

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);
}
于 2013-01-18T09:32:13.293 に答える