有没有办法可以使用 as3 访问 iPad 的相机?
- 我的意思是在应用程序本身内启动相机
- 有能力拍摄并将图像保存到 byteArray 并将图像应用到背景或进行一些操作
我已经做了一些研究,其中大部分只是展示了如何访问 android 设备。感谢您的任何建议或帮助。
有没有办法可以使用 as3 访问 iPad 的相机?
我已经做了一些研究,其中大部分只是展示了如何访问 android 设备。感谢您的任何建议或帮助。
是的,你绝对可以做到这一点。Flash 的美妙之处在于执行此操作的代码与您在 Android 或 PC 上使用的代码相同。
从字面上看,您可以这样做以将相机连接到 Video 对象:
var camera:Camera = Camera.getCamera();
var video=new Video();
video.attachCamera(camera);
this.addChild(video); // 'this' would be a Sprite or UIComponent, etc...
如果你想做一些有用的事情,还有很多事情要做,但是一旦你开始,它就相当简单了 :)
bluebill1049,我不确定你是否得到了你想要的东西,但我确实看到了你对整个班级的要求。我在这篇文章中找到了相同的信息(Jason Sturges 在他的回答中发布的信息)。
使用适用于 iOS 的 Adobe Builder (flex) 拍照
与他在这里的回复不同,他对该帖子的回复有一个链接,指向一个关于构建移动应用程序的精彩教程,并且正是从该教程中提取/引用了该代码。它需要包含在该项目/教程中的事件类(event.CameraEvent - 仅几行),因此能够回到源代码非常重要。该来源位于此处:
http://devgirl.org/files/RIAUnleashed/
感谢杰森。只是为了让您不必挖掘,这是引用中缺少的事件类:
package events
{
import flash.events.Event;
import flash.filesystem.File;
public class CameraEvent extends Event
{
public static const FILE_READY:String = "fileReady";
public var file:File;
public function CameraEvent(type:String, file:File=null, bubbles:Boolean = true, cancelable:Boolean = true)
{
super(type, bubbles, cancelable);
this.file = file;
}
}
}
希望有帮助!
使用加载器并不是在 iOS 上访问图像字节的唯一方法。事实证明,数据一开始就已经是 JPEG 格式,因此不需要再次对其进行编码。
只需执行 amediaPromise.open()
即可获取字节并直接保存它们。
XpenseIt 示例代码提供了这个相机实现:
类:CameraUtil:
package utils
{
import events.CameraEvent;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.MediaEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.media.CameraRoll;
import flash.media.CameraUI;
import flash.media.MediaPromise;
import flash.media.MediaType;
import flash.utils.ByteArray;
import mx.events.DynamicEvent;
import mx.graphics.codec.JPEGEncoder;
[Event(name = "fileReady", type = "events.CameraEvent")]
public class CameraUtil extends EventDispatcher
{
protected var camera:CameraUI;
protected var loader:Loader;
public var file:File;
public function CameraUtil()
{
if (CameraUI.isSupported)
{
camera = new CameraUI();
camera.addEventListener(MediaEvent.COMPLETE, mediaEventComplete);
}
}
public function takePicture():void
{
if (camera)
camera.launch(MediaType.IMAGE);
}
protected function mediaEventComplete(event:MediaEvent):void
{
var mediaPromise:MediaPromise = event.data;
if (mediaPromise.file == null)
{
// For iOS we need to load with a Loader first
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleted);
loader.loadFilePromise(mediaPromise);
return;
}
else
{
// Android we can just dispatch the event that it's complete
file = new File(mediaPromise.file.url);
dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
}
}
protected function loaderCompleted(event:Event):void
{
var loaderInfo:LoaderInfo = event.target as LoaderInfo;
if (CameraRoll.supportsAddBitmapData)
{
var bitmapData:BitmapData = new BitmapData(loaderInfo.width, loaderInfo.height);
bitmapData.draw(loaderInfo.loader);
file = File.applicationStorageDirectory.resolvePath("receipt" + new Date().time + ".jpg");
var stream:FileStream = new FileStream()
stream.open(file, FileMode.WRITE);
var j:JPEGEncoder = new JPEGEncoder();
var bytes:ByteArray = j.encode(bitmapData);
stream.writeBytes(bytes, 0, bytes.bytesAvailable);
stream.close();
trace(file.url);
dispatchEvent(new CameraEvent(CameraEvent.FILE_READY, file));
}
}
}
}