处理绘图/绘画/保存多个位图

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,它需要一个带有一些idedited位图(对原始位图的所有修改都相同),将其添加到队列中,然后添加每个项目该队列中的它会保留在外部存储中。它有有限的Executor 实例来执行该任务(它们可能只是Runnable)和Service 创建一个HashMap,其中将任务的Future 映射到位图标识符。因此,当新的Bitmap 出现时,Service 检查地图并替换等待任务(具有相同的原始位图)(如果存在)。

您可以从FragmentStatePagerAdapterdestroyItem 拦截器向此Service 发送任务。

因此,当用户单击保存按钮时,您还应该将所有已编辑的位图发送到此Service 并等待完成。

【讨论】:

我也是这么想的,你怎么看Tap? @MaxRockwood 看起来不错,就像一个 android 服务的扁平包装器,square 几乎总能创造出一个好的想法。但是我之前没用过 是的,就我的情况而言,队列系统似乎很有希望,我会试一试并发布更新。

以上是关于处理绘图/绘画/保存多个位图的主要内容,如果未能解决你的问题,请参考以下文章

如何在绘画时将旧位图显示到DrawingView中

如何在vb中保存图片框(绘画程序)中的内容

谁知道啥绘画软件?

菜鸟求助关于Canvas绘图背景问题。

绘图和绘画机器人的算法 - 任何提示?

在 iOS / iPad 上编写绘画应用程序的最佳方法