我在一个文件中有一个大位图(比如3888x2592).现在,我想将该位图的大小调整为800x533并将其保存到另一个文件中.我通常会通过调用Bitmap.createBitmap方法来缩放位图,但它需要一个源位图作为第一个参数,我无法提供,因为将原始图像加载到Bitmap对象当然会超出内存(例如,请参见此处).
我也无法读取位图,例如,BitmapFactory.decodeFile(file, options)提供a BitmapFactory.Options.inSampleSize,因为我想将其调整为精确的宽度和高度.使用inSampleSize会将位图的大小调整为972x648(如果我使用inSampleSize=4)或778x518(如果我使用inSampleSize=5,它甚至不是2的幂).
我还想避免使用inSampleSize在第一步中使用例如972x648读取图像,然后在第二步中将其大小调整为800x533,因为与直接调整原始图像大小相比,质量会很差.
总结我的问题:是否有办法读取10MP或更高的大图像文件并将其保存到新的图像文件,调整大小到特定的新宽度和高度,而不会得到OutOfMemory异常?
我也尝试BitmapFactory.decodeFile(file, options)手动将Options.outHeight和Options.outWidth值设置为800和533,但它不起作用.
我最近发现 NDK 代码可以分配的内存量没有硬性限制,而您可以在 Java 端分配的内存量非常有限(在大多数设备上约为 25Mb)。
我想编写一个图像处理应用程序(类似于 Photoshop),它需要一次在内存中保留几个大位图,其中位图数据将占用大约 20Mb 的内存。在 Java 中执行此操作会使应用程序在我尝试过的许多设备上容易出现内存不足异常。
我当前的所有代码都使用 Bitmap 和 Canvas 类来处理我的图像。 任何人都可以建议某种方式,允许我在 C 端分配大部分内存,并且仍然使用 Bitmap+Canvas 来执行我的绘图操作(使用 Android 2.1 及更高版本)?
例如,如果我的图像由 6 个位图图层组成并且用户在第 3 层上绘画,我需要在第 3 层上绘制一个油漆斑点位图,然后更新屏幕以显示将所有图层展平在最上面的结果彼此实时。我已经考虑了将我在 C 中的 6 个位图分配为 int 数组并使用 Canvas 在 Java 端使用存储在 Bitmap 对象中的正在编辑的图层副本执行绘画操作的方法。我不确定扁平化阶段将如何工作。