Android 获取缩放后的图像文件长度
Android Getting scaled image file length
这是我的问题:
我要求我的用户在同一图片的不同尺寸之间进行选择,以便上传它。
我的界面显示了 4 个按钮,每个按钮提供有关图像的宽度、高度和文件长度的信息。
我设法生成了调用 Bitmap.createScaledBitmap 的四个版本的图像,然后再次将这些位图压缩到文件中。
我很清楚我需要回收位图并在完成后删除文件。
但是,当尝试计算大文件时,方法 createScaledBitmap 会抛出内存不足异常。
我被告知使用选项 inJustDecodeBounds 来解码文件,但它会 return 一个空位图。
有人知道如何解决这个问题吗?
代码如下:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bmp = getScaledBitmap(BitmapFactory.decodeFile(uri, options), ratio);
private Bitmap getScaledBitmap(Bitmap bmp, float ratio) {
int srcWidth = bmp.getWidth();
int srcHeight = bmp.getHeight();
int dstWidth = (int)(srcWidth * ratio);
int dstHeight = (int)(srcHeight * ratio);
Bitmap result = Bitmap.createScaledBitmap(bmp, dstWidth, dstHeight, true);
bmp.recycle();
return result;
}
为了回答您的回复,我不认为它是重复的。我之前找到了您链接的线程,但是它很旧并且没有解决我的问题。
总之,我解决了问题。
我首先尝试使用 Glide 库,据说它更适合内存管理。虽然,有改进,但并不完美,问题又出现了。
使用 android:largeHeap="true" 结束我的噩梦。这必须在清单的应用程序字段中设置。
我希望这对其他人有所帮助。
这是我的问题:
我要求我的用户在同一图片的不同尺寸之间进行选择,以便上传它。
我的界面显示了 4 个按钮,每个按钮提供有关图像的宽度、高度和文件长度的信息。
我设法生成了调用 Bitmap.createScaledBitmap 的四个版本的图像,然后再次将这些位图压缩到文件中。
我很清楚我需要回收位图并在完成后删除文件。
但是,当尝试计算大文件时,方法 createScaledBitmap 会抛出内存不足异常。
我被告知使用选项 inJustDecodeBounds 来解码文件,但它会 return 一个空位图。
有人知道如何解决这个问题吗?
代码如下:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bmp = getScaledBitmap(BitmapFactory.decodeFile(uri, options), ratio);
private Bitmap getScaledBitmap(Bitmap bmp, float ratio) {
int srcWidth = bmp.getWidth();
int srcHeight = bmp.getHeight();
int dstWidth = (int)(srcWidth * ratio);
int dstHeight = (int)(srcHeight * ratio);
Bitmap result = Bitmap.createScaledBitmap(bmp, dstWidth, dstHeight, true);
bmp.recycle();
return result;
}
为了回答您的回复,我不认为它是重复的。我之前找到了您链接的线程,但是它很旧并且没有解决我的问题。
总之,我解决了问题。
我首先尝试使用 Glide 库,据说它更适合内存管理。虽然,有改进,但并不完美,问题又出现了。
使用 android:largeHeap="true" 结束我的噩梦。这必须在清单的应用程序字段中设置。
我希望这对其他人有所帮助。