处理绘图/绘画/保存多个位图
Posted
技术标签:
【中文标题】处理绘图/绘画/保存多个位图【英文标题】:Handing Drawing / Painting / Saving of multiple bitmaps 【发布时间】:2017-03-02 03:43:15 【问题描述】:目标:
我想在 pdf 的位图上绘制/书写/绘画并将它们保存在一起,以便我可以向它们发送电子邮件。
详情:
我有多个Pdf
文件,每个文件都包含5-20
页面,现在我正在从pdfs
中提取位图并将它们加载到ViewPager
中的片段中,
我可以在其中滑动它们并写/画或任何我想要的。为了保存/恢复位图的当前状态,我使用了onSaveInstanceState
。
这样我就可以在来回滑动时检索位图的最后阶段。
类似这样的:
@Override
public void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
outState.putParcelable("Bitmap", bitmap);
问题:
用户按下发送电子邮件按钮,无论他在哪个页面上,我都应该能够保存所有图像,即他已经编辑了第 5 到 10 页 现在他在第 10 页并按下发送按钮我应该能够检索所有已编辑的图像。
问题 2:
正如我所说,图像数量约为 5-20,将状态保存在 onSaveInstanceState
效果很好,但它会不断增加 ram 中的应用程序内存,并且应用程序在应用程序大小变为 @ 的第 10 个图像时崩溃987654328@.
但将图像保存为 onSaveInstanceState
中的捆绑包也是必要的,因为它有助于在用户向后滑动时更快地加载图像。
所以我在想有什么方法可以创建自定义捆绑包 我们可以在滚动 5 页后将图像写入磁盘的类 并在用户清除内存并将其从磁盘读回内存 正在向后滚动?这听起来合理吗?
我尝试过的:
由于位图是在单独的片段中加载的,我试图将位图保存到OnDestroy
的外部存储中,但是由于将位图保存到磁盘不是一项小任务,虽然我使用的是AsyncTask
,但这需要时间
但是当用户在片段之间快速滑动时,将位图保存在OnDestroy
中似乎不是一种方便的方式。
这就是我问这个问题的原因,所以也许您对情况有更好的了解,可以帮助我以更方便的方式实现这一目标。
那么你打算如何处理这种情况?
注意:
如果您无法理解情况并需要更多信息,请给我留言,我会更新问题。
谢谢
【问题讨论】:
我有以下问题要问您。 1.您是否根据布局宽度/高度缩小图像并显示到viewpager。如果不是你必须这样做(这将减少位图内存消耗)。 2.假设您在每个图像上都有一个画布,用户在上面画了一些东西,当用户滑动到下一个时,您保存对图像的更改。 (这种做法会增加图片大小)。 【参考方案1】:让我描述一下我现在如何看待这个问题的解决方案。
应该有一个Service
,它需要一个带有一些id的edited位图(对原始位图的所有修改都相同),将其添加到队列中,然后添加每个项目该队列中的它会保留在外部存储中。它有有限的Executor
实例来执行该任务(它们可能只是Runnable
)和Service
创建一个HashMap
,其中将任务的Future
映射到位图标识符。因此,当新的Bitmap
出现时,Service
检查地图并替换等待任务(具有相同的原始位图)(如果存在)。
您可以从FragmentStatePagerAdapter
的destroyItem
拦截器向此Service
发送任务。
因此,当用户单击保存按钮时,您还应该将所有已编辑的位图发送到此Service
并等待完成。
【讨论】:
我也是这么想的,你怎么看Tap? @MaxRockwood 看起来不错,就像一个 android 服务的扁平包装器,square 几乎总能创造出一个好的想法。但是我之前没用过 是的,就我的情况而言,队列系统似乎很有希望,我会试一试并发布更新。以上是关于处理绘图/绘画/保存多个位图的主要内容,如果未能解决你的问题,请参考以下文章