我遇到了间歇性的问题,即从相机活动中捕获图像,将其保存为较小的尺寸,并将保存的图像上传到我的服务器。
如果图像文件大于特定阈值(我使用2,000KB),我正在调用以下函数对其进行下采样并保存较小的图像:
private void downsampleLargePhoto(Uri uri, int fileSizeKB)
{
int scaleFactor = (int) (fileSizeKB / fileSizeLimit);
log("image is " + scaleFactor + " times too large");
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
try
{
options.inJustDecodeBounds = false;
options.inSampleSize = scaleFactor;
Bitmap scaledBitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(uri), null, options);
log("scaled bitmap has size " + scaledBitmap.getWidth() + " x " + scaledBitmap.getHeight());
String scaledFilename = uri.getPath();
log("save scaled image to file " + scaledFilename);
FileOutputStream out = new FileOutputStream(scaledFilename);
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
scaledBitmap.recycle();
File image = new java.io.File(scaledFilename);
int newFileSize = (int) image.length()/1000;
log("scaled image file is size " + newFileSize + " KB");
}
catch(FileNotFoundException f)
{
log("FileNotFoundException: " + f);
}
}
但是,对于非常大的图像,我的应用程序在行上出现OutOfMemoryError崩溃:
Bitmap scaledBitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(uri), null, options);
此时我还能做些什么来缩小图像?
答案 0 :(得分:0)
您还没有真正尝试过正确使用API。您应该设置inJustDecodeBounds = true然后调用decodeStream()。一旦你有了解码图像的大小,那么为inSampleSize选择一个合适的值 - 它应该是(a)2的幂,(b)与压缩的图像文件大小无关 - 然后调用decodeStream( )第二次。
为了选择合适的inSampleSize值,我通常会参考屏幕尺寸,即如果图像最大边缘是屏幕最大边缘的两倍以上,则设置inSampleSize = 2。等等。