Android сфотографировать и изменить его размер перед сохранением на SD-карте
40601 просмотра
6 ответа
Я хочу, чтобы мой код изменил размер изображения перед сохранением, но я ничего не могу найти в Google. Не могли бы вы мне помочь, пожалуйста ?
Это код (из документа Android):
private void galleryAddPic() {
Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(mCurrentPhotoPath);
picturePathForUpload = mCurrentPhotoPath;
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent);
}
После этого я должен загрузить его на сервер.
Большое спасибо.
Автор: Florian Mac Langlade Источник Размещён: 12.11.2019 09:21Ответы (6)
28 плюса
Вы можете сохранить растровое изображение, следуя коду
Bitmap photo = (Bitmap) "your Bitmap image";
photo = Bitmap.createScaledBitmap(photo, 100, 100, false);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "Imagename.jpg");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
Автор: Prabu
Размещён: 17.04.2013 02:28
5 плюса
После прочтения других ответов и не найдя именно то, что я хотел, вот мой подход к получению надлежащим образом масштабированного растрового изображения. Это адаптация ответа Прабу.
Это гарантирует, что ваша картинка масштабируется таким образом, чтобы не искажать размеры фотографии:
public saveScaledPhotoToFile() {
//Convert your photo to a bitmap
Bitmap photoBm = (Bitmap) "your Bitmap image";
//get its orginal dimensions
int bmOriginalWidth = photoBm.getWidth();
int bmOriginalHeight = photoBm.getHeight();
double originalWidthToHeightRatio = 1.0 * bmOriginalWidth / bmOriginalHeight;
double originalHeightToWidthRatio = 1.0 * bmOriginalHeight / bmOriginalWidth;
//choose a maximum height
int maxHeight = 1024;
//choose a max width
int maxWidth = 1024;
//call the method to get the scaled bitmap
photoBm = getScaledBitmap(photoBm, bmOriginalWidth, bmOriginalHeight,
originalWidthToHeightRatio, originalHeightToWidthRatio,
maxHeight, maxWidth);
/**********THE REST OF THIS IS FROM Prabu's answer*******/
//create a byte array output stream to hold the photo's bytes
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
//compress the photo's bytes into the byte array output stream
photoBm.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
//construct a File object to save the scaled file to
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "Imagename.jpg");
//create the file
f.createNewFile();
//create an FileOutputStream on the created file
FileOutputStream fo = new FileOutputStream(f);
//write the photo's bytes to the file
fo.write(bytes.toByteArray());
//finish by closing the FileOutputStream
fo.close();
}
private static Bitmap getScaledBitmap(Bitmap bm, int bmOriginalWidth, int bmOriginalHeight, double originalWidthToHeightRatio, double originalHeightToWidthRatio, int maxHeight, int maxWidth) {
if(bmOriginalWidth > maxWidth || bmOriginalHeight > maxHeight) {
Log.v(TAG, format("RESIZING bitmap FROM %sx%s ", bmOriginalWidth, bmOriginalHeight));
if(bmOriginalWidth > bmOriginalHeight) {
bm = scaleDeminsFromWidth(bm, maxWidth, bmOriginalHeight, originalHeightToWidthRatio);
} else {
bm = scaleDeminsFromHeight(bm, maxHeight, bmOriginalHeight, originalWidthToHeightRatio);
}
Log.v(TAG, format("RESIZED bitmap TO %sx%s ", bm.getWidth(), bm.getHeight()));
}
return bm;
}
private static Bitmap scaleDeminsFromHeight(Bitmap bm, int maxHeight, int bmOriginalHeight, double originalWidthToHeightRatio) {
int newHeight = (int) Math.min(maxHeight, bmOriginalHeight * .55);
int newWidth = (int) (newHeight * originalWidthToHeightRatio);
bm = Bitmap.createScaledBitmap(bm, newWidth, newHeight, true);
return bm;
}
private static Bitmap scaleDeminsFromWidth(Bitmap bm, int maxWidth, int bmOriginalWidth, double originalHeightToWidthRatio) {
//scale the width
int newWidth = (int) Math.min(maxWidth, bmOriginalWidth * .75);
int newHeight = (int) (newWidth * originalHeightToWidthRatio);
bm = Bitmap.createScaledBitmap(bm, newWidth, newHeight, true);
return bm;
}
Вот соответствующая ссылка на мой GitHub Gist: https://gist.github.com/Lwdthe1/2d1cd0a12f30c18db698
Автор: lwdthe1 Размещён: 24.03.2016 09:574 плюса
Сначала преобразуйте изображение в растровое изображение, затем используйте этот код:
Bitmap yourBitmap;
Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
Автор: Anchal
Размещён: 17.04.2013 12:40
1 плюс
Посмотрите, это поможет полностью. В общем, если вы делаете снимок камерой с намерением, вы получите uri
изображение в результате, вы прочитаете его как уменьшенное изображение и сохраните его в том же месте.
0 плюса
Если вы хотите сделать полноразмерное изображение, то у вас нет выбора, кроме как сохранить его в корзину SD, а затем изменить размер изображения.
Однако, если миниатюрного изображения достаточно, нет необходимости сохранять его на SD-карте, и вы можете извлечь его из дополнений возвращенного намерения.
Вы можете посмотреть это руководство, которое я написал для обоих методов съемки с использованием встроенной камеры Activity
:
0 плюса
BitmapFactory.Options optionsSignature = new BitmapFactory.Options();
final Bitmap bitmapSignature = BitmapFactory.decodeFile(
fileUriSignature.getPath(), optionsSignature);
Bitmap resizedSignature = Bitmap.createScaledBitmap(
bitmapSignature, 256, 128, true);
signature.setImageBitmap(resizedSignature);
Автор: chandramouli poreddy
Размещён: 26.04.2016 04:33
Вопросы из категории :
- android Насколько хорошо отражает эмулятор Android Phone?
- android Как сохранить состояние активности Android с помощью сохранения состояния экземпляра?
- android Android: доступ к дочерним представлениям из ListView
- android Как вызвать SOAP веб-сервис на Android
- android Как вы форматируете дату и время в Android?
- android Android: Получение имени файла с камеры?
- android Перезапуск активности при ротации Android
- android Проблема с нехваткой памяти при загрузке изображения в растровый объект
- android Отправьте приложение с базой данных
- android Как удалить контакт программно в Android
- android-camera Проверьте, есть ли у устройства камера?
- android-camera Фотосъемка с камеры без предварительного просмотра
- android-camera Android: невозможно получить RAW-данные с камеры?
- android-camera Преобразование битмап-массива в YUV (YCbCr NV21)
- android-camera Приложение разбилось при нажатии кнопки «Назад» на Android-камере
- android-camera Android-камера предварительного просмотра обратного вызова и медиа-рекордер запись видео
- android-camera Android / Java: сохранение байтового массива в файл (.jpeg)
- android-camera Преобразование YUV-> RGB (Обработка изображений) -> YUV во время onPreviewFrame в Android?
- android-camera Как запустить фронтальную камеру с намерением?
- android-camera Камера Android: намерение передачи данных возвращает ноль