由于3 ios cameraUI保存和加载图像失败,为什么?
我正在使用下面的AS3代码通过摄像头拍照。Android上的一切都很好,但当我在iPad上测试时,我在尝试加载保存的图像时出错。ioErrorHandler1返回: ioErrorHandler:[IOErrorEvent type=“ioError”bubbles=false cancelable=false eventPhase=2 text=“Error#2124:加载的文件是未知类型。URL:app storage:/myImage.jpg“errorID=2124] 有人知道为什么吗?(如前所述,它在Android上工作)。代码如下:由于3 ios cameraUI保存和加载图像失败,为什么?,ios,actionscript-3,flash,Ios,Actionscript 3,Flash,我正在使用下面的AS3代码通过摄像头拍照。Android上的一切都很好,但当我在iPad上测试时,我在尝试加载保存的图像时出错。ioErrorHandler1返回: ioErrorHandler:[IOErrorEvent type=“ioError”bubbles=false cancelable=false eventPhase=2 text=“Error#2124:加载的文件是未知类型。URL:app storage:/myImage.jpg“errorID=2124] 有人知道为什么吗?
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");
}
在将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);
}
我找到了解决办法。如果我在eventSource上放置一个eventlistener,它在没有jpgencoder的情况下工作。如果其他人可以使用该解决方案,我将在此处发布: ImageCapture函数更新如下:
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);
}
是的,它在使用jpg编码器时工作,谢谢!唯一的问题是速度很慢。保存部分需要很长时间。你知道为什么吗?我觉得奇怪的是,当我的代码在安卓系统上运行时,它却不能在iPad上运行。我想花时间的是编码,而不是实际的节省。也许要寻找一种更有效的编码方法?