将 android 文件上的图像缩放到文件
Scale image on android file to file
我正在尝试缩小图像,然后再将它们发送到我的 android 应用程序的后端。
目前我正在使用 BitmapFactory.decodeFile()
和 inJustDecodeBounds
选项执行此操作。但它会跳过传感器信息,结果我得到了旋转的图像。我通过设置转换矩阵来修复它。这是我的代码:
File image = new File(uri.getPath());
int angle = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(image.getPath());
int orientation = exif.getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL);
switch (orientation) {
case ORIENTATION_ROTATE_90:
angle = 90;
break;
case ORIENTATION_ROTATE_180:
angle = 180;
break;
case ORIENTATION_ROTATE_270:
angle = 270;
break;
}
} catch (IOException e) {
if (DEBUG) e.printStackTrace();
}
Matrix mat = new Matrix();
mat.postRotate(angle);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(image.getAbsolutePath(), options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), options);
if (angle != 0) {
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true);
}
if (DEBUG) {
Log.d("COMPRESS", "scaled bitmap size: " + bitmap.getWidth() + "x" + bitmap.getHeight());
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, buffer);
bitmap.recycle();
return buffer.toByteArray();
但是这种方法会导致 OOM 异常,因为它在内存中执行所有操作并且
每个非 0 度图像被加载到内存中两次。
更好的方法可能是直接缩放,将传感器和其他元数据信息直接保存到文件中。我为此尝试 ffmpeg libarary 但它挂了。
我尝试 google 其他一些库,但对于我的所有请求,它给了我如何在 ImageView
、Canvas
等
中缩放图像的答案
那么有没有其他方法可以有效地缩放 android 上的图像?
谢谢。
我会使用 Picasso:http://square.github.io/picasso/ 因为它能够流畅地处理方向、调整大小和内存不足 API。
Bitmap smaller = Picasso.with(context)
.load(new File(uri.getPath()))
.resize(800, 800) // this is max size
.centerInside()
.get();
... carry on with compress code
我正在尝试缩小图像,然后再将它们发送到我的 android 应用程序的后端。
目前我正在使用 BitmapFactory.decodeFile()
和 inJustDecodeBounds
选项执行此操作。但它会跳过传感器信息,结果我得到了旋转的图像。我通过设置转换矩阵来修复它。这是我的代码:
File image = new File(uri.getPath());
int angle = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(image.getPath());
int orientation = exif.getAttributeInt(TAG_ORIENTATION, ORIENTATION_NORMAL);
switch (orientation) {
case ORIENTATION_ROTATE_90:
angle = 90;
break;
case ORIENTATION_ROTATE_180:
angle = 180;
break;
case ORIENTATION_ROTATE_270:
angle = 270;
break;
}
} catch (IOException e) {
if (DEBUG) e.printStackTrace();
}
Matrix mat = new Matrix();
mat.postRotate(angle);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(image.getAbsolutePath(), options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), options);
if (angle != 0) {
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true);
}
if (DEBUG) {
Log.d("COMPRESS", "scaled bitmap size: " + bitmap.getWidth() + "x" + bitmap.getHeight());
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, buffer);
bitmap.recycle();
return buffer.toByteArray();
但是这种方法会导致 OOM 异常,因为它在内存中执行所有操作并且 每个非 0 度图像被加载到内存中两次。
更好的方法可能是直接缩放,将传感器和其他元数据信息直接保存到文件中。我为此尝试 ffmpeg libarary 但它挂了。
我尝试 google 其他一些库,但对于我的所有请求,它给了我如何在 ImageView
、Canvas
等
那么有没有其他方法可以有效地缩放 android 上的图像? 谢谢。
我会使用 Picasso:http://square.github.io/picasso/ 因为它能够流畅地处理方向、调整大小和内存不足 API。
Bitmap smaller = Picasso.with(context)
.load(new File(uri.getPath()))
.resize(800, 800) // this is max size
.centerInside()
.get();
... carry on with compress code