快速,稳健地保存/加载文档状态,用于图像编辑器

时间:2010-10-08 22:09:16

标签: java iphone android serialization image-processing

我正在寻找一些关于我为Android和iPhone手机存储位图编辑器状态的方法的批评。即使是“看起来很好!”反应会很棒!

在应用程序中,当前用户文档包含几个可以绘制的位图图层(每个可能是1024 x 768像素)。该应用程序的基本要求是:

  1. 我需要能够保存和恢复文档状态。

  2. 当用户退出应用程序或拨打电话时,我需要能够快速保存文档状态(大约2秒钟内)。

  3. 如果应用程序崩溃,我需要能够恢复文档状态(如果用户可能失去30秒的工作,则可以。)

  4. 对于1,我找不到任何支持图层的打开文件格式。我将使用以下文件结构来存储我的文档:

    document_folder/
      layer1.png
      layer2.png
      ...
      metadata.xml
    

    图层只存储为.png文件,.xml文件包含数据,例如当前可见的图层。文档文件夹可以由应用程序按原样打开,也可以将文件夹存储在.zip文件中。对于其他应用程序来说,这似乎是一个很好的简单格式。

    除了.png文件外,我还允许以自定义.raw文件格式保存图层,其中包含来自位图的未处理原始像素数据。我可以在手机上快速保存这些内容(< 0.5s),而.png文件需要一两秒钟。

    我在启动时快速保存文档的计划是创建一个名为/ autosave的文件夹,并在那里保存所有图层的.raw版本。在一个图层上编辑几个命令之后,我会在后台线程中更新该图层的.raw文件。为了保存时的稳健性,我会将图层保存为例如layer1_tmp.raw,当我确认文件已完全写入后,将layer1.raw替换为此文件。

    如果应用程序在使用过程中崩溃,我只需重新打开/ autosave文件夹。当应用程序关闭或用户接到电话时,我只需要将最后修改的层更新为自动保存。当用户想要保存时,我只是将所有.raw文件转换为.png文件,然后压缩文件夹。

    你怎么看?有明显的缺陷吗?有更简单的方法吗?我不知怎的重新发明轮子?感谢。

2 个答案:

答案 0 :(得分:1)

你的想法对我很好:在你去的时候将图层保存在背景中。用户当前未编辑的任何图层都应排队等待,以便在它们切换到其他图层时立即保存。如果应用程序被中断,您只需要保存当前工作层,正如您所说,可以在0.5秒内完成。

为什么还要打扰png格式?如果将数据导出到另一台机器/系统,您只需要它,对吗?

答案 1 :(得分:0)

我认为你有一个很棒的计划。我可能会采用相同的方式(但这本身并不意味着什么: - )

我在想的是,如果你不仅可以有一个工作线程保存文件而是一个完整的后台服务(当然还有工作线程,因为服务本身也在主线程中运行)。

通过这种方式,您可以确保始终存在可以处理图层增量的活动,无论图形活动是否已崩溃或有人在呼叫您。突然间,您没有相同的时序约束(如果需要,写操作可能需要10秒,您的活动既不会被阻止,也不会依赖于写操作)。当然,当您的服务清空其保存队列(以节省系统资源)时,您的服务将自动生效。

为了进一步宣传这个想法,我不知道你要写入原始文件的数据量是多少?您是每次都写完整的1024x768图层还是仅重写更改的部分?我也不确定数据如何实际传输到服务(来自Activity)。我不知道是否有一个字节数组的最大大小 - 额外的一个Intent可以处理。

希望这会给你更多的想法。

干杯!