android - 在相机意图中选择图像大小
问题描述
我是这个论坛的新手,所以请多多包涵,如果有错误,请轻轻指出,所以我正在做一个将图像上传到服务器的项目,现在我想限制图像的大小,我' m 提供“单击图像”选项,我的代码将打开默认相机意图并单击图片,或“从图库中选择”。我的问题是关于“点击图片”,现在当用户点击图片时,我可以预设可以点击的图片最大尺寸吗?
解决方案
您可以在 onActivityResult 方法中调整图像大小,尝试以下代码片段
public static Bitmap handleSamplingAndRotationBitmap(Context context, Uri selectedImage)
throws IOException {
int MAX_HEIGHT = 1024;
int MAX_WIDTH = 1024;
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
InputStream imageStream = context.getContentResolver().openInputStream(selectedImage);
BitmapFactory.decodeStream(imageStream, null, options);
imageStream.close();
options.inSampleSize = calculateInSampleSizes(options, MAX_WIDTH, MAX_HEIGHT);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
imageStream = context.getContentResolver().openInputStream(selectedImage);
Bitmap img = BitmapFactory.decodeStream(imageStream, null, options);
img = rotateImageIfRequired(context, img, selectedImage);
return img;
}
private static int calculateInSampleSizes(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee a final image
// with both dimensions larger than or equal to the requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
// This offers some additional logic in case the image has a strange
// aspect ratio. For example, a panorama may have a much larger
// width than height. In these cases the total pixels might still
// end up being too large to fit comfortably in memory, so we should
// be more aggressive with sample down the image (=larger inSampleSize).
final float totalPixels = width * height;
// Anything more than 2x the requested pixels we'll sample down further
final float totalReqPixelsCap = reqWidth * reqHeight * 2;
while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
inSampleSize++;
}
}
return inSampleSize;
}
private static Bitmap rotateImageIfRequired(Context context, Bitmap img, Uri selectedImage) throws IOException {
InputStream input = context.getContentResolver().openInputStream(selectedImage);
ExifInterface ei;
if (Build.VERSION.SDK_INT > 23)
ei = new ExifInterface(input);
else
ei = new ExifInterface(selectedImage.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return rotateImage(img, 90);
case ExifInterface.ORIENTATION_ROTATE_180:
return rotateImage(img, 180);
case ExifInterface.ORIENTATION_ROTATE_270:
return rotateImage(img, 270);
default:
return img;
}
}
private static Bitmap rotateImage(Bitmap img, int degree) {
Matrix matrix = new Matrix();
matrix.postRotate(degree);
Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
img.recycle();
return rotatedImg;
}
你只需要调用handleSamplingAndRotationBitmap方法,你会得到一个可以自己设置大小的位图。PS: 案例 sumsung 手机旋转拍摄的一些图片是不正确的,所以我们也需要处理图片的方向,希望可以帮助你。
推荐阅读
- python - 带有软删除的 SQLAlchemy 关联表
- django - Django all-auth:如何通过 Google 禁用自动登录
- sql-server - SQL查询列出特定数据库/服务器中的所有表+列?
- c++ - g++ 的分段错误(在 NaN 上使用两次 to_string 时)
- c# - 有没有办法减少加载 cshtml 视图的时间?
- javascript - 如何更新数组javascript中对象的内容
- arrays - Python Numpy 将奇怪的空格串起来
- ios - 使用导航栏模态显示 ViewController 不会更改 stackView
- typescript - 动态创建组件的 Vue 响应性
- java - 在 MySQL 和 SQL Server 中实现 SQL 递归查询?