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

私の質問は、これらは一緒に機能しますか、それともどちらかまたは両方ですか?私のニーズに最適な方法はどれですか?

繰り返しになりますが、ユーザープロフィール写真用に96pxx96pxのボックスがあります。ユーザーが写真を撮った後、画像を引き伸ばさずにボックス全体に塗りつぶしたいと思います。写真を撮る時点でサイズを設定する、または事後にimageViewor 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、システムに写真を撮るように求められます(つまり、ユーザーはデフォルトのカメラアプリでプロンプトが表示され、写真を撮るか、ギャラリーから1つを選択します)。

Camera2番目のアプローチを使用する場合は、最初のアプローチよりもはるかにカスタマイズ可能な独自のオブジェクトを作成します。

最初の方法では後で画像を拡大縮小する必要がありますが、2番目の方法では正しいサイズで直接写真を撮ることができるため、主な違いは、最初の方法はAndroidによって制御され、2番目の方法はアプリによって直接制御されることです。したがって、2番目の方法はニーズに最適です。後でスケーリングしたくない場合。

とにかく拡大縮小する場合(以下を参照)、写真を撮るためにどのアプローチを使用するかは問題ではありません。その場合は、デフォルトのアプリを使用します

写真を撮る時点でサイズを設定する、または事後にimageViewまたはビットマップ(または...?)を変更する最良の方法はありますか?または、ユーザーに画像を切り抜いてもらい、切り抜き領域の寸法を定義できるようにする必要がありますか?

それはあなたのニーズに依存します。最初のケースでは、アプリが撮影した写真を変更するため、元の写真のどの部分を最終的な96x96の写真にするかを選択します。この方法の問題は、ユーザーにとって誤った方法で、または少なくとも予期しない方法で画像を誤ってトリミング/ストレッチ/操作する可能性があることです(つまり、顔の一部を削除する)。

2番目の方法を使用すると、ユーザーが画像のどの部分を希望するかを自由に選択できるようになります。

元の画像の最良の部分を自動的に検出できる場合は、最初の方法を使用する必要がありますが、実際にはどちらが最良の方法であるかを尋ねているので、2番目の方法を使用する必要があります。エンドユーザー。

于 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のような写真がもう1つ必要です。

96dp程度のサイズの画像を使用する場合は、画像サイズについて心配する必要はありません。アクティビティで複数のビットマップを実行しようとすると、通常、新しいビットマップの作成と破棄は非常に危険です。「メモリ不足」の問題などの問題に簡単に遭遇する可能性があります。したがって、代わりにURIを使用することをお勧めします。したがって、インテントに挿入するURIを保存し、URIのリストを作成して、必要に応じてリストビューに表示します。

imageviewでは、setImageURI(Uri uri)です。

それがあなたのすべての質問に答えることを願っています。

于 2013-04-01T20:01:35.357 に答える