在Android上调整图片大小

时间:2014-10-04 18:10:39

标签: android image picasso

经过谷歌搜索后,我还没有找到一种方法来调整保持质量的图像大小。

我有我的图像 - 由相机以全分辨率存储 -

String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/my_directory/my_file_name.jpg";

现在,我需要调整它的大小,保留宽高比,然后保存到另一条路径

如果没有出现错误“ xxxxxxx-byte allocation 上的内存不足”,最好的方法是什么?

我继续在三星设备上检索此错误,我尝试过各种方式,即使是使用毕加索图书馆。

谢谢!

1 个答案:

答案 0 :(得分:0)

第1件事:根据设备和位图大小,无论你做什么魔法代码,它都会崩溃!特别便宜的三星手机通常只有不超过16mb的RAM。

您可以使用此代码How to get current memory usage in android?检查可用内存量并正确处理。

进行这些计算时,请记住位图是未压缩图像,这意味着,即使JPG可能为100kb,Bitmap也可能需要几MB。

您将使用此处显示的代码https://developer.android.com/training/displaying-bitmaps/load-bitmap.html来读取位图边界,并尽可能接近您实际需要的尺寸进行近似缩小,或者足以使设备不会崩溃。这就是正确测量记忆力的重要原因。

第一个代码几乎没有从磁盘创建的RAM,只需从图像中跳过像素就可以缩小它。这就是为什么它是近似的,它只是在2的幂的缩放。

然后你将使用标准API缩小到你实际需要的大小https://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap(android.graphics.Bitmap,int,int,boolean)

所以它的伪代码将是:

try{
    Info info = getImageInfo(File);
    int power2scale = calculateScale(info, w, h);
    Bitmap smaller = preScaleFromDisk(File, power2scale);
    Bitmap bitmap = Bitmap.createScaledBitmap(smaller, w, h, f);
} catch(OutOfMemoryError ooe){
    // call GC
    // sleep to let GC run
    // try again with higher power2scale
}