Выберите размер изображения в намерении камеры

1

Я новичок в этом форуме, поэтому, пожалуйста, потерпите меня и аккуратно укажите на ошибки, если таковые имеются, поэтому я работаю над проектом, в котором я загружаю изображения на сервер, и теперь я хочу ограничить размер изображений. m дает возможность "Нажать на изображение", где мой код откроет намерение камеры по умолчанию и щелкнет на картинке, или "Выбрать из галереи". Мой вопрос касается "Нажмите на изображение". Теперь, когда пользователь нажимает на изображение, могу ли я предварительно установить максимальный размер изображения, на которое можно нажать?

Теги:
android-studio
android-camera-intent

2 ответа

0

Вы можете изменить размер изображения в методе onActivityResult, попробуйте следующий фрагмент кода

 public static Bitmap handleSamplingAndRotationBitmap(Context context, Uri selectedImage)
            throws IOException {
        int MAX_HEIGHT = 1024;
        int MAX_WIDTH = 1024;
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        InputStream imageStream = context.getContentResolver().openInputStream(selectedImage);
        BitmapFactory.decodeStream(imageStream, null, options);
        imageStream.close();
        options.inSampleSize = calculateInSampleSizes(options, MAX_WIDTH, MAX_HEIGHT);
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        imageStream = context.getContentResolver().openInputStream(selectedImage);
        Bitmap img = BitmapFactory.decodeStream(imageStream, null, options);
        img = rotateImageIfRequired(context, img, selectedImage);
        return img;
    }

    private static int calculateInSampleSizes(BitmapFactory.Options options,
                                             int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will guarantee a final image
            // with both dimensions larger than or equal to the requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;

            // This offers some additional logic in case the image has a strange
            // aspect ratio. For example, a panorama may have a much larger
            // width than height. In these cases the total pixels might still
            // end up being too large to fit comfortably in memory, so we should
            // be more aggressive with sample down the image (=larger inSampleSize).

            final float totalPixels = width * height;

            // Anything more than 2x the requested pixels we'll sample down further
            final float totalReqPixelsCap = reqWidth * reqHeight * 2;

            while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
                inSampleSize++;
            }
        }
        return inSampleSize;
    }
    private static Bitmap rotateImageIfRequired(Context context, Bitmap img, Uri selectedImage) throws IOException {

        InputStream input = context.getContentResolver().openInputStream(selectedImage);
        ExifInterface ei;
        if (Build.VERSION.SDK_INT > 23)
            ei = new ExifInterface(input);
        else
            ei = new ExifInterface(selectedImage.getPath());

        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                return rotateImage(img, 90);
            case ExifInterface.ORIENTATION_ROTATE_180:
                return rotateImage(img, 180);
            case ExifInterface.ORIENTATION_ROTATE_270:
                return rotateImage(img, 270);
            default:
                return img;
        }
    }
    private static Bitmap rotateImage(Bitmap img, int degree) {
        Matrix matrix = new Matrix();
        matrix.postRotate(degree);
        Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
        img.recycle();
        return rotatedImg;
    }

вам просто нужно вызвать метод handleSamplingAndRotationBitmap, вы получите растровое изображение, размер которого можно установить самостоятельно. PS: Случай, когда некоторые снимки, сделанные с помощью поворота телефона sumsung, неверны, поэтому нам нужно также управлять ориентацией изображения, надеюсь, это поможет вам.

0

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

String imagePath = Environment.getExternalStorageDirectory() + "/yourImagefile.png";
File imageFile = new File(imagePath );
long filelength = imageFile .length();
length = filelength/1024;

эта length даст вам размер в КБ. тогда вы можете добавить, если условие, как показано ниже

 if(length>sizeyouwant){
    //delete image and toast message with info
    if(imageFile.exists()) {
       imageFile.delete();
    }
    Toast.makeText(getApplicationContext(),
    "Image is not saved due to image size exceeds limit....",
    Toast.LENGTH_SHORT).show();
  }
  • 0
    Это проверит размер файла, но я хочу ограничить размер файла jpg во время захвата фотографии. Если камера похожа на заметку oneplus или samsung, в которой размер изображения составляет 4-5 МБ, то пользователь будет продолжать снимать фотографии с помощью моей камеры, и изображения большого размера не будут приниматься, что будет бесконечным циклом.
  • 1
    Я понятия не имею о размере чека во время захвата. Я думаю, что это сложно. Но вы можете уменьшить размер после захвата или установить более низкое разрешение для камеры, но это не даст никаких гарантий, что ваш файл не превысит определенного предела.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню