Android 缩放后保存全尺寸图像的位图

Android 缩放后保存全尺寸图像的位图,android,image,bitmap,out-of-memory,surfaceview,Android,Image,Bitmap,Out Of Memory,Surfaceview,我的应用程序使用一个SurfaceView向用户显示一幅图像,并让他们在已拍摄的图像上操作标签。为了减少内存使用,我缩放了所有这些位图以适应屏幕。现在我想保存用户刚刚贴上所有标签的图像,我想用原始图像的分辨率保存它。如果不将全尺寸图像加载到内存中并冒着发生OutOfMemoryError的风险,a如何做到这一点?我不知道从哪里开始,使用给定的工具,这似乎是一项不可能完成的任务。我将做以下工作:必须将编辑和合成分离开来。在编辑过程中,将用户想要的内容保存在某些POJO中(例如,标签编号A位于X、Y

我的应用程序使用一个
SurfaceView
向用户显示一幅图像,并让他们在已拍摄的图像上操作标签。为了减少内存使用,我缩放了所有这些位图以适应屏幕。现在我想保存用户刚刚贴上所有标签的图像,我想用原始图像的分辨率保存它。如果不将全尺寸图像加载到内存中并冒着发生
OutOfMemoryError
的风险,a如何做到这一点?我不知道从哪里开始,使用给定的工具,这似乎是一项不可能完成的任务。

我将做以下工作:必须将编辑和合成分离开来。在编辑过程中,将用户想要的内容保存在某些POJO中(例如,标签编号A位于X、Y位置,旋转方向为R) 然后在构图步骤中处理高分辨率图像-但只能逐个处理以节省内存。
在最坏的情况下,如果仍然遇到内存限制,则必须使用平铺。

如果要保存位图而不缩小其大小,则必须使用平铺。有两种选择

  • 在应用程序标记(清单)中使用largeHeap=true
  • 如果你能承受一点质量损失!使用压缩位图
  • 示例代码

    ByteArrayOutputStream out = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);
        Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));
    
    下面是指向位图类压缩方法文档的链接。

    并非不可能-只是有点棘手;-)在清单内的应用程序标记中添加
    android:largeHeap=true
    @我听说设置
    android:largeHeap=true
    不是最佳实践。我想我会尽量减少我的内存使用,并将其作为最后的手段。布莱恩在你的情况下是合适的。因为您希望在内存中加载整个位图,而不降低其大小@Muhammad Babar谢谢你,我最终使用的是android:largeHeap=true,无论我多么努力地降低内存使用率(即使缩小图像),我仍然在一些设备上获得了
    的内存错误。所以最后,在大堆的情况下,我成功地保留了完整大小的图像,并重用了大部分贴纸位图,以尽可能降低内存使用率。这就是我所担心的。起初,我根本没有缩放我的图像,它在我的Nexus平板电脑和模拟器上运行良好(直到大约16张贴纸,取决于原始图像的大小,但我可以使用它)。但当我加载从相机(特别是三星设备)拍摄的图像时,它会在某些设备上抛出一个
    OutOfMemoryError
    。因此,如果我必须将原始图像加载到内存中,我认为在某些设备上它必须是一个更小的图像。不要害怕——恐惧无助于解决问题。把它当作一个有趣的挑战,一旦你做到了,就要感到自豪;-)我最终不得不使用
    largeHeap=true
    ,这只是在某些设备上使用了太多内存。这主要是一系列降低内存的方法的结晶,但最终我仍然需要使用一个大堆。事实上,我在某些设备(特别是三星Galaxy S4和S5)上仍然存在一些问题,这些设备不喜欢在纵向模式下从自己的相机加载全尺寸图像。奇怪的是,景观效果很好。