Android сфотографировать и изменить его размер перед сохранением на SD-карте

android android-camera

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:57

4 плюса

Сначала преобразуйте изображение в растровое изображение, затем используйте этот код:

Bitmap yourBitmap;
Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);
Автор: Anchal Размещён: 17.04.2013 12:40

1 плюс

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

Автор: Arun C Размещён: 17.04.2013 12:43

0 плюса

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

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

Вы можете посмотреть это руководство, которое я написал для обоих методов съемки с использованием встроенной камеры Activity:

Руководство: Android: используйте функцию «Активность камеры» для миниатюр и полноразмерных изображений

Автор: Emil Adz Размещён: 17.04.2013 02:33

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
Вопросы из категории :
32x32