使用 Adob​​e AIR 在 iOS 上保存位图

Posted

技术标签:

【中文标题】使用 Adob​​e AIR 在 iOS 上保存位图【英文标题】:Saving bitmap on iOS using Adobe AIR 【发布时间】:2016-07-30 02:01:15 【问题描述】:

我终于尝试将我的 Flash 游戏移植到应用程序中,从 ios 开始。我被困在图像保存功能上。在 swf 中,我使用 jpegencoder 保存到桌面服务器。经过一些研究,该代码似乎仍然可以在移动设备上运行,所以我尝试了它,但在 Adob​​e AIR 的 iPhone 上进行测试时,它似乎没有做任何事情(按钮注册了一次点击,但没有图像可以发现,没有发生任何事情的通知,没有请求访问图像的权限等)。这是旧代码:

saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave);
function saveToDiscSave(e:MouseEvent):void 
    this.visible = false;  //hides menu

    var bitmapData:BitmapData = new BitmapData(1242,1864);
    bitmapData.draw(MovieClip(root));
    var jpgEncoder:JPGEncoder = new JPGEncoder(80);
    var byteArray:ByteArray = jpgEncoder.encode(bitmapData);
    var fileReference:FileReference=new FileReference();
    fileReference.save(byteArray, "Dinogeddon-DollDivine.jpg");

    //this.visible = true;  //returns menu. commented out to see if click registered

因此,经过更多研究,我发现 CameraRoll 代码看起来很简单,就像是专门为 iOS 制作的一样。所以我尝试了,但我遇到了同样的问题:没有证据表明发生了什么事。没有图像保存,没有错误,没有权限请求。

saveToDisc.addEventListener(MouseEvent.CLICK, saveToDiscSave);
function saveToDiscSave(e:MouseEvent):void 
    this.visible = false;

    var cameraRoll:CameraRoll = new CameraRoll();
    var bitmapData:BitmapData = new BitmapData(1242,1864);
    bitmapData.draw(MovieClip(root));
    cameraRoll.addBitmapData(bitmapData);

    //this.visible = true;

就像,我什至不知道我哪里出错了。处于测试模式的应用程序甚至可以保存图像吗?我应该期待弹出某种通知吗?保存到手机的内容是否有大小限制?暂停

【问题讨论】:

您想要相机胶卷中的图像吗?或者只是存储在设备上的某个位置,以后可以再次检索它? FileReference 我认为不适用于移动设备,您必须使用 FileStream 和 File 类保存到应用程序存储目录。你确定CameraRoll.supportsAddBitmapData 是真的吗? 另外,您应该监听错误,因为相机胶卷 addBitmapData 方法是一个异步操作。 cameraRoll.addEventListener(ErrorEvent.ERROR, handleMyError);,也可以监听Event.COMPLETE事件。 应用程序不需要图像。仅供用户自己阅读。我不在乎它是否专门用于相机胶卷..我只是希望将它保存在这种事情习惯的任何地方? 相机胶卷是最合适的地方。侦听错误并检查以确保支持 CameraRoll(但应始终在 iOS 上)。 在设备上测试时如何监听错误?我会在我电脑上的模拟器上试一试,但它会测试游戏的超级巨无霸并在我的显示器上切断下半部分,所以我无法真正测试大多数按钮。这很令人沮丧:/ 【参考方案1】:

所以...相机胶卷代码确实有效,就像我拥有它一样。 这确实是一种非常好的和简洁的方式。 我想我在正确测试时遇到了问题,只是无法判断它是否有效。

正常工作时,它会在设备上请求一次许可,然后在不通知的情况下保存,所以我添加了一些动画来隐藏保存按钮几秒钟,这样用户就不会自己过度发送垃圾邮件,并且给出按钮被按下的视觉提示。

【讨论】:

【参考方案2】:

移动应用程序的行为与桌面应用程序非常相似,但您的代码并没有真正适应这种情况。您甚至没有尝试使用专为桌面和移动设备制作的类,例如 File 类。无论如何,在我向您展示您需要忘记为 web 执行 swf 的步骤(这是您的代码显示的内容)之前,您需要移动/桌面应用程序然后调整您的思维并使用 AIR 类。

首先,通过归档一个字节数组来获取数据:

var byteArray:ByteArray = new ByteArray();
bitmapData.encode(new Rectangle(0,0,bitmapData.width,bitmapData.height), new PNGEncoderOptions(), byteArray);

其次,选择一个目的地(在移动设备上通常是 File.applicationStorageDirectory),是的,使用 AIR 类 File。

var dest:File = File.applicationStorageDirectory.resolvePath("mypng.png");

第三,你得到了数据,你得到了目的地,现在使用 AIR 类 FileStream 保存:

var stream:FileStream = new FileStream();
stream.open(dest, FileMode.WRITE);
stream.writeBytes(byteArray);
stream.close();

就是这样。使用 File 类在存储目录中创建目录和文件。小心,在移动设备上,您将不能将文件保存在任何地方,这就是为什么使用 applicationStorageDirectory 更好,因为它始终可用并且被沙盒化供您使用。

【讨论】:

我发现如果你在iOS的应用程序存储目录中写入位图数据会很慢。我用的 ANE 写得太快了。 在 Ios 上使用 Adob​​e AIR 的唯一缓慢操作是绘制位图数据,它可以是 n * 100 毫秒。 不要这么认为,我尝试保存从iphone5截取的全屏,与ANE保存位图数据相比,保存需要很多。 你不同意,然后继续确认我说的话,你有没有看我的评论? 我是说如果你写像OP有1242,1864这样的大bitmapdata的话,在ios上通过Filestream写的操作很慢。

以上是关于使用 Adob​​e AIR 在 iOS 上保存位图的主要内容,如果未能解决你的问题,请参考以下文章

使用 Adob​​e AIR 下载文件

在没有开发许可证的情况下在 iOS 上测试 Adob​​e AIR 移动应用程序

将 Adob​​e AIR 应用程序部署到 iOS 模拟器

在 Android/iOS 中使用 Adob​​e AIR 播放 AAC 流

iOS 8 中的 Adob​​e AIR - 后台通知操作

尝试使用权限时,使用 Adob​​e AIR SDK 24 构建的 iOS 应用程序崩溃