13

我目前正在使用意图拍照,如下所示:

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);

我的问题是,这些是一起工作还是非此即彼?哪种方法最适合我的需求?

同样,我有 96 像素 x 96 像素的用户资料图片框。用户拍照后,我希望图像填充整个框而不拉伸。最好的方法是在拍摄照片时设置尺寸,还是在事后更改imageView或(或...?)?bitmap或者,我应该让用户裁剪图片,然后我可以定义裁剪区域的尺寸吗?

编辑:请参阅赏金以获取更新的问题。

4

4 回答 4

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);
于 2013-03-28T20:11:11.233 回答
6

您可以使用Bitmap.createScaleBitmap(Bitmap src, int destWidth, int destHeight, boolean filter)来调整位图的大小

于 2013-03-28T03:08:32.607 回答
3

这些是一起工作还是非此即彼?哪种方法最适合我的需求?

不,他们不一起工作。当您将相机与 一起使用时Intent,您是在要求系统为您拍照(即,用户会收到使用默认相机应用程序的提示并拍照或从图库中选择一张)。

当您使用第二种方法时,您将创建自己的Camera对象,它比第一种方法更可定制。

使用第一种方法,您必须在之后缩放图像,而使用第二种方法,您可以直接以正确的尺寸拍摄图片,因此主要区别在于第一种由android控制,第二种由您的应用程序直接控制,所以第二种方法最适合您的需求。如果您以后不想扩展。

如果您无论如何都要缩放(请阅读下文),那么您使用哪种方法拍照并不重要,我会说在这种情况下,使用默认应用程序

在拍摄照片时设置大小或事后更改 imageView 或位图(或...?)的最佳方法是什么?或者,我应该让用户裁剪图片,然后我可以定义裁剪区域的尺寸吗?

这取决于您的需求。在第一种情况下,您的应用程序会更改拍摄的图片,因此您选择原始图片的哪个部分将成为最终的 96x96 图片。这种方法的问题在于,您可能会意外地以错误的方式(或至少是出乎意料的方式)对图像进行裁剪/拉伸/操作(即移除他们的部分面部)。

当您使用第二种方法时,您可以让用户自由选择他们想要的图片的哪一部分。

如果您能够自动检测到原始图像的最佳部分,您应该使用第一种方法,但是当您实际上询问哪种方法是最好的方法时,您应该使用第二种方法,因为它提供了更大的灵活性最终用户。

于 2013-04-03T14:26:03.190 回答
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,并制作一个 uri 列表,以根据需要显示在列表视图上。

在 imageview 上,它是 setImageURI(Uri uri)。

希望能回答你所有的问题。

于 2013-04-01T20:01:35.357 回答