- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想裁剪图像而不会出现 OutOfMemory
异常。
这意味着我有裁剪图像的 x、y、宽度和高度,并且想要裁剪原始图像而不将其存入内存。
是的,我知道 BitmapRegionDecoder
是个好主意,但裁剪后的图像可能太大而无法存储。
ImageView
中显示它我想将它保存在一个新文件中
不丢失尺寸
在这种情况下,裁剪后的图像分辨率为 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/
我正在调查我们的应用程序运行缓慢的问题,最终导致集群环境中的一个实例出现故障。几周前我遇到了以下错误: [#|2012-05-11T14:12:03.460-0400|SEVERE|sun-appse
我创建了一个应用程序,基本上使用机器人在客户端获取图像并每隔几秒发送一次到服务器,这样我就可以看到另一台 PC 上发生了什么。问题似乎是它一直将图像保存在数组或其他东西中,因为几秒钟后,它崩溃了。我只
我正在使用 universal-image-loader-1.6.2.jar(最新的)。我正在尝试使用此库下载并缓存该图像。我要从服务器下载 47 张图片,总共 5.22 Mb。我的最大图片尺寸为 7
我在玩 Scala 的惰性迭代器,但遇到了一个问题。我想要做的是读取一个大文件,进行转换,然后写出结果: object FileProcessor { def main(args: Array[S
当涉及到服务器环境的垃圾收集/内存限制时,.Net 框架的行为是否可能有所不同?我在具有 32gbs 物理内存的 64 位服务器计算机上显式运行 x86 编译的应用程序,并且内存不足(SystemOu
在我的应用程序启动时,我正在创建具有 75*10^6 容量的长哈希集。 Profiler 显示,该应用程序使用 1.4g。我尝试设置-Xmx1600m,但发现内存不足。 -Xmx2000m 相同。 -
我有一项关于使用数字列表构建金字塔的任务,但一项测试存在一个问题。在我的任务中,我需要对列表进行排序。我使用 Collections.sort(): Collections.sort(inputNum
在对我为 Windows Mobile 编写的类库进行一些最终测试时(使用 Compact Net Framework 2.0),我遇到了 OOM 异常。 基本上,我的库首先加载一个字典文件(一个带有
编辑:我将其重新表述为问题并将答案移至答案部分... 在一个相对复杂的多线程 .NET 应用程序中,我遇到了 OutOfMemoryException,即使在我认为没有理由的情况下也是如此。 情况:
当我尝试使用下面的方法将一些文本内容设置到我们心爱的窗口的剪贴板时 片段,它在 10-15MB 的范围内工作正常。但是超过这个大小,它会抛出一条错误消息 显示在最后。我们如何将 30+ MB 的 ut
我想在 Android 中将 PDF 图像发送到服务器。 服务器规范需要我应该使用 Base64 编码。 所以我应该将 PDF 图像文件转换为 Base64 字符串。 下面是 HTTP POST 请求
我正在解析设备上的二进制文件并将我关心的字段存储在数组中。这些文件可以生成大小为 100,000 的数组。自然地,java 告诉我内存不足(我认为 android 每个应用程序只允许 16MB)。 还
我正在尝试从一个 txt 文件(书籍)中读取,然后将它的每一行添加到一个链表中。但是,当我运行代码时,我在 l.add(line); 处遇到内存不足错误。你能告诉我这段代码做错了什么吗?或者,是否有更
我通过允许用户选择要显示的图片从 SD 卡加载位图。创建位图后,我在 ImageView 中设置位图: mBitmap = Bitmap.createBitmap(Media.getBitmap(th
我试图在 gridview 中显示很多图像。有两个 Activity 。它们都有 gridviews,其中有图像。当我只启动其中一个时。没有问题,但是当我启动另一个时,存在“outifmemory”问
我需要在我的应用程序中显示许多图像。这些是 jpg 和 png,我将它们加载到 ImageView 中,如下所示: tile.setImageResource(R.drawable.tile_high
我正在开发一个远程备份应用程序,有时我需要上传大文件,例如 15 MB,我在一些手机上测试过我遇到内存不足的错误 有没有办法使用这个函数来使用更少的内存? public int uploadFile(
我在模拟器和设备(acer 平板电脑和三星 galaxy)上运行我的项目时出现 OutOfMemory 异常,显示 the application launcher process com.andro
我有一个程序可以为目录(子)树中的每个文件创建一个对象。在磁盘越来越大的今天,没有办法知道会有多少文件,尤其是。不是几年(几个月?)从现在开始。 我的程序不是企业关键的;它是用户分析该子树的工具。所以
我已经使用以下命令从命令行启动了我的jar java -Xms1200m -Xmx1500m -jar xxx.jar 我正在创建大小为 12600 * 12600 的 BufferedImage 意
我是一名优秀的程序员,十分优秀!