gpt4 book ai didi

android - 在没有 OutOfMemory 的情况下裁剪图像 - Android

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:57:31 25 4
gpt4 key购买 nike

我想裁剪图像而不会出现 OutOfMemory 异常。
这意味着我有裁剪图像的 x、y、宽度和高度,并且想要裁剪原始图像而不将其存入内存。
是的,我知道 BitmapRegionDecoder 是个好主意,但裁剪后的图像可能太大而无法存储。

事实上我不想要 copped 位图,只想将裁剪后的图像从源文件写入目标文件。


编辑:我想 保存裁剪后的图像,而不仅仅是在 ImageView 中显示它我想将它保存在一个新文件中 不丢失尺寸

这是例子
enter image description here

在这种情况下,裁剪后的图像分辨率为 20000x20000,下面的代码将因 OOM 而无法工作:

BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmap = bitmapRegionDecoder.decodeRegion(new Rect(width / 2 - 100, height / 2 - 100, width / 2 + 100, height / 2 + 100), options);
mImageView.setImageBitmap(bitmap);

使用 inSampleSize 减小原始图片尺寸很好,但我保存的结果不再是 20000x20000。

如何裁剪 25000x25000 并将图像的 20000x20000 部分保存到文件中?

最佳答案

简单地说,它需要大量的底层编程和优化。

如您所见,该区域的许多答案都指向位图压缩等的一般概念,这些概念确实适用于大多数问题,但不适用于您的问题。

答案中建议的 BitmapRegionDecoder 也无法正常工作。它肯定会阻止将整个位图加载到 RAM 中,但是裁剪后的图像呢?裁剪图像后,它会为您提供一个巨大的位图,无论如何都会给您带来 OOM。

因为您所描述的问题,需要像从内存中写入或读取位图一样从磁盘写入或读取位图;一种称为 BufferedBitmap(或类似)的东西,它通过将位图的小块保存到磁盘并在以后使用它们来有效地处理它所需的内存,从而避免 OOM。

任何其他想要解决缩放问题的解决方案都只能完成一半的工作。为什么?因为裁剪后的图像本身对于内存来说可能太大(如您所说)。

但是,如果您不关心裁剪图像的质量与用户在裁剪图像时看到的质量相比,通过缩放解决问题并没有那么糟糕。这就是 Google Photos 所做的,它只是降低了裁剪图像的质量,非常简单!

我还没有看到任何 BufferedBitmap 类(但如果有,那就太棒了)。他们肯定会在解决类似问题时变得得心应手。

您可以查看 Telegram 消息传递应用程序,它带有图像裁剪工具的开源实现;你猜对了,它处理了所有与旧 C 类似的令人讨厌的工作......因此,我们可能会得出结论,一个好的全局解决方案(或者更好地说,几个适用的解决方案之一)似乎是处理磁盘的低级编程并记住自己。

我知道我的回答未能为您的问题提供任何复制粘贴式的解决方案,但至少我希望它能给您一些想法,我的 friend 。

关于android - 在没有 OutOfMemory 的情况下裁剪图像 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com