我目前正在使用意图拍照,如下:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
intent.putExtra("return-data", true);
startActivityForResult(intent, CAMERA_REQUEST);
但我真的需要将图像大小设置为尽可能接近正方形。所以在研究之后,你似乎需要做这样的事情:
Camera camera = Camera.open();
Parameters params = camera.getParameters();
List<Camera.Size> sizes = params.getSupportedPictureSizes();
// Once you will see the supported Sizes, you can define them with the method :
setPictureSize(int width, int height);
我的问题是,这些是一起工作还是一个/或?哪种方法最适合我的需求?
同样,我有96px到96px的盒子用于用户个人资料照片。用户拍摄照片后,我希望图像无需拉伸即可填满整个盒子。是在拍摄照片时设置尺寸的最佳方法,还是在事后改变imageView
或bitmap
(或......?)?或者,我应该让用户裁剪图片,我可以定义裁剪区域尺寸吗?
编辑:请参阅赏金以了解更新的问题。
答案 0 :(得分:16)
此代码允许我从图库中选择图像。裁剪并使用我的宽高比。我使用相机做了类似的代码。用户拍照后,立即启动活动裁剪图片。
Intent photoPickerIntent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
photoPickerIntent.putExtra("crop", "true");
photoPickerIntent.putExtra("outputX", 150);
photoPickerIntent.putExtra("outputY", 150);
photoPickerIntent.putExtra("aspectX", 1);
photoPickerIntent.putExtra("aspectY", 1);
photoPickerIntent.putExtra("scale", true);
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
photoPickerIntent.putExtra("outputFormat",
Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(photoPickerIntent, RESULT_LOAD_IMAGE);
答案 1 :(得分:6)
您可以使用Bitmap.createScaleBitmap(Bitmap src, int destWidth, int destHeight, boolean filter)
调整位图大小
答案 2 :(得分:3)
这些是一起工作还是一个/或?哪种方法最适合我的需求?
不,他们不能一起工作。当您使用带有Intent
的相机时,您要求系统为您拍照(即,用户会收到默认相机应用程序的提示并拍照或从库中选择一个)。
当您使用第二种方法时,您可以创建自己的Camera
对象,该对象比第一种方法更具可定制性。
使用第一种方法后,您将不得不缩放图像,而使用第二种方法,您可以直接拍摄正确尺寸的图片,因此主要区别在于第一种方法是由android控制,第二种是由您控制应用程序直接,所以第二种方法最适合您的需要。如果您不想在之后进行扩展。
如果您要进行缩放(请参阅下文),那么您使用哪种方法拍摄照片并不重要,我会说,在这种情况下,使用默认应用
是在拍摄照片时设置尺寸的最佳方法,还是在事后更改了imageView或位图(或......?)?或者,我应该让用户裁剪图片,我可以定义裁剪区域尺寸吗?
这取决于您的需求。在第一种情况下,您的应用会改变拍摄的照片,因此您选择原始照片的哪一部分将是最终的96x96照片。这种方法的问题在于,您可能会意外地以错误方式裁剪/拉伸/操纵图像 - 或者至少以意外方式为用户操作(即移除部分脸部)。
当您使用第二种方法时,您可以向用户提供自由选择他们想要的图片的哪一部分。
如果你能够自动检测原始图像的最佳部分,你应该采用第一种方法,但实际上你正在问哪种方法最好,你应该选择第二种方法< / strong>,因为它为最终用户提供了更多灵活性。
答案 3 :(得分:2)
(1)如何自动裁剪以适合我的ImageView(96dp x 96dp),
看起来你已经有了一个解决方案来让裁剪正确。如果要将密度像素单位转换为与手机对应的像素单位,则需要使用
public int dpToPixel(int dp) {
Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());
}
所以你可以使用以下作为额外的
photoPickerIntent.putExtra("outputX", dpToPixel(96));
photoPickerIntent.putExtra("outputY", dpToPixel(96));
(2)如何缩小图片的大小(制作新的位图?)。这些需要在ListViews上快速加载。因此,不需要上传1MB图片,而是需要更多像2,000k。
如果使用大小为96dp的图像,则无需担心图像大小。当您尝试在活动中执行多个位图时,创建和销毁新位图通常非常危险。您可以轻松遇到诸如“内存不足”问题。因此,建议使用Uri代替。所以,保存你所投入意图的uri,然后制作一个uris'列表,以便在列表视图中显示,无论你想要什么。
在imageview上,它是setImageURI(Uri uri)。
希望能回答你的所有问题。