java - 图像处理应用程序的内存使用情况

标签 java android image-processing mobile

我正在编写一个图像处理应用程序(例如,操作包括模糊、旋转、缩放、合并、洪水填充),我担心内存使用。

我遇到的问题是我需要使用位图+ Canvas ,以便我可以利用现有功能来操作图像,并且我还需要将图像的副本放入 int 数组中以将像素修改为对于模糊和洪水填充等某些操作,使用 set/getPixel 函数修改位图太慢。

我当前的内存使用情况是:

  • 图像本身的 Bitmap 对象。
  • 一个离屏 Bitmap 对象,用于使用 Canvas 执行图像操作任务。
  • 用于 mask 的纯 Alpha 位图。
  • 两个 int 数组,每个数组都有足够的像素来包含主图像的副本。

例如,我使用两个 int 数组来执行洪水填充操作:我将主图像复制到一个数组,将主图像的灰度版本放入另一个数组中(其中灰度表示是使用离屏创建的)首先是Bitamp和Canvas),在进行颜色比较时使用灰度图像在第一个数组中执行洪水填充操作,然后将最终图像复制回主图像Bitmap。我也许可以消除此操作的屏幕外位图,但是例如我使用离屏位图来执行绘画操作。

有什么技巧可以用来减少内存使用吗?例如,是否有任何快速方法可以修改像素而不涉及制作 Bitmap 对象的 int 数组副本?我可以使用Canvas对象直接修改int数组吗?

我想添加图层功能(即主图像将由多个位图组成),但我的内存已经不足。

最佳答案

根据您使用两个 int 数组的用途,您可以考虑将它们设为字节数组。同样,根据您的用途,您可以使用二进制掩码在每个字节中存储多个位标志。而且,根据您希望边界检测的工作方式,您可以减少用于洪水填充操作的图像上的每像素位数。 HTH

关于java - 图像处理应用程序的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725390/

相关文章:

java - 如何设置一个长整数的SeekBar进度? (或替代品)

matlab - 如何使用 MATLAB 围绕不是图像中心点的点旋转图像?

c# - 用于颜色提取 EMGUCV 的图像 HSV 的取值范围

image-processing - 通过分析二值前景图像的白色像素来进行车辆计数所需的想法

java - 使用 Javassist 向运行时生成的类添加注释

java - Spring Boot 2 无法将属性读取为字符串

java - 如何通过java程序在ubuntu中cd并执行可执行文件

即使类是公共(public)的,Java 访问子类的方法时也会出错

Java 计算器给出奇怪的结果

android - 如果使用 FLAG_ACTIVITY_REORDER_TO_FRONT,后退按钮不会加载堆栈中的最后一个 Activity