Подтвердить что ты не робот

Установить размер камеры - параметры против намерения?

В настоящее время я использую намерение сделать снимок, например:

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 (или...?) После факта? ИЛИ, должен ли я позволить пользователям обрезать изображение, и я могу определить размеры области обрезки?

Изменить: см. подсказку для обновленного вопроса.

4b9b3361

Ответ 1

Этот код позволяет мне выбирать изображение из галереи. Обрезайте и используйте соотношение сторон. Я сделал аналогичный код для использования камеры. После того, как пользователь сделает снимок, он немедленно запускает действие для обрезки изображения.

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

Ответ 2

Вы можете использовать Bitmap.createScaleBitmap(Bitmap src, int destWidth, int destHeight, boolean filter) для изменения размера растрового изображения

Ответ 3

Они работают вместе или являются ли они или или? Какой метод лучше всего подходит для моих нужд?

Нет, они не работают вместе. Когда вы используете камеру с Intent, вы просите систему сделать снимок для вас (т.е. Пользователь получает приглашение с помощью приложения камеры по умолчанию и делает снимок или выбирает один из галереи).

Когда вы используете второй подход, вы создаете свой собственный объект Camera, который намного настраивается, чем первый.

При первом методе вам придется масштабировать изображение потом, а во втором вы можете сделать снимок прямо в правильном размере, поэтому главное отличие в том, что первое контролируется андроидом, а второе - вашим приложение, поэтому второй метод лучше всего подходит для ваших нужд., если вы не хотите впоследствии масштабировать.

Если вы все равно собираетесь масштабировать (читайте ниже), то не имеет значения, какой подход вы используете для съемки, я бы сказал, в этом случае использовать приложение по умолчанию.

Является ли лучший способ установить размер в момент съемки или изменить изображение или растровое изображение (или...?) после факта? ИЛИ, должен ли я позволить пользователям обрезать изображение, и я могу определить размеры области обрезки?

Это зависит от ваших потребностей. В первом случае ваше приложение изменяет сделанный снимок, поэтому вы выбираете, какая часть исходного изображения будет последней картиной 96x96. Проблема с этим методом заключается в том, что вы можете случайно обрезать/стрелять/манипулировать изображением в неправильном или, по крайней мере, неожиданном для пользователя (т.е. Удалить часть своего лица).

Когда вы используете второй метод, вы предоставляете пользователю свободу выбора, какую часть изображения они хотят.

Если вы можете автоматически определять лучшую часть исходного изображения, вы должны пойти первым методом, но поскольку вы действительно спрашиваете, какой из них лучший метод, , вы должны действительно пойти со вторым, поскольку он предоставляет пользователю более гибкость.

Ответ 4

(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. Таким образом, вместо загрузки 1 Мб, мне нужно еще одно, например, 2000 КБ.

Если вы используете изображение размером около 96dp, вам не нужно беспокоиться о размерах изображений. Создание и уничтожение новых растровых изображений обычно очень опасно, когда вы пытаетесь сделать несколько из них в действии. Вы можете легко столкнуться с такими проблемами, как проблемы с "нехваткой памяти". Поэтому рекомендуется использовать Uri вместо этого. Итак, сохраните uri, который вы вкладываете в намерение, и создайте список uris для отображения в списке, но вы хотите.

В представлении изображения это setImageURI (Uri uri).

Надеюсь, что ответит на все ваши вопросы.