Я хочу уменьшить размер изображения при выборе изображения из галереи или при съемке - PullRequest
0 голосов
/ 02 мая 2020

Когда я делаю снимок, мой код уменьшает размер изображения и поворачивает его, если это необходимо. Но когда я выбираю что-то вроде 6 изображений из галереи, появляется ERROR (outofmemory).

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

textCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (i.resolveActivity(getPackageManager()) != null){
                    File imageFile = null;
                    try {
                        imageFile = getImageFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (imageFile != null){
                        Uri imageUri = FileProvider.getUriForFile(MainActivity.this,
                                "com.gustavo.android.filerevise",
                                imageFile);
                        i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                        startActivityForResult(i, SELECAO_CAMERA);
                    }
                }
                dialog.dismiss();
            }
        });

        textGaleria.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                if (i.resolveActivity(getPackageManager()) != null){
                    startActivityForResult(i, SELECAO_GALERIA);
                }
                dialog.dismiss();
            }
        });


 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK){
            Bitmap imagem = null;
            try {
                switch (requestCode){
                    case SELECAO_CAMERA:
                        imagem = rotateImage(setReducedImageSize());
                        listPath.add(currentImagePath);
                        Log.d("Path", "onClick: " + listPath);
                        break;

                    case SELECAO_GALERIA:
                        Uri localImagemSelecionada = data.getData();
                        InputStream imageStream = getContentResolver().openInputStream(localImagemSelecionada);
                        imagem = BitmapFactory.decodeStream(imageStream);
                        listPath.add(null);
                        Log.d("Path", "onClick: " + listPath);
                        break;
                }

                if (imagem!= null){
                    imagemConfigurada = new Imagem();
                    imagemConfigurada.setImagem(imagem);
                    listImagens.add(imagemConfigurada);
                    Log.d("Imagem", "onActivityResult: " + listImagens);
                    adapter.notifyDataSetChanged();
                }
                textQtdImagem.setText("Você adicionou " + listImagens.size() + " de 6 imagens");
                textQtdImagem.setGravity(Gravity.CENTER_HORIZONTAL);

            }catch (Exception e){
                e.printStackTrace();
            }

        }

    }

private File getImageFile()throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );
        currentImagePath = image.getAbsolutePath();
        return image;
    }
    enter code here
    private Bitmap setReducedImageSize(){
        final float scale = getResources().getDisplayMetrics().density;
        int padding_150dp = (int) (150 * scale + 0.5f);

        int targetImageViewWidth = padding_150dp;
        int targetImageViewHeight = padding_150dp;

        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(currentImagePath, bmOptions);

        int cameraImageWidth = bmOptions.outWidth;
        int cameraImageHeight = bmOptions.outHeight;

        int scaleFactor = Math.min(cameraImageWidth/targetImageViewWidth, cameraImageHeight/targetImageViewHeight);
        bmOptions.inSampleSize = scaleFactor;
        bmOptions.inJustDecodeBounds = false;

        return BitmapFactory.decodeFile(currentImagePath, bmOptions);

    }

    private Bitmap rotateImage(Bitmap bitmap){
        ExifInterface exifInterface = null;

        try {
            exifInterface = new ExifInterface(currentImagePath);
        }catch (IOException e){
            e.printStackTrace();
        }

        int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

        Matrix matrix = new Matrix();
        switch (orientation){
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(270);
                break;
            default:
        }
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

    }

проблема заключается в методе setReducedImageSize получить изображение из файла при съемке. Но когда из Галереи, у меня нет Пути.

1 Ответ

0 голосов
/ 05 мая 2020

Код ниже решит мою проблему:

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK){
            Bitmap imagem = null;
            try {
                switch (requestCode){
                    case SELECAO_CAMERA:
                        imagem = imageTreatment(SELECAO_CAMERA, null, currentImagePath);
                        listPath.add(currentImagePath);
                        Log.d("Path", "onClick: " + listPath);
                        break;

                    case SELECAO_GALERIA:
                        Uri localImagemSelecionada = data.getData();

                    String [] filePath = {MediaStore.Images.Media.DATA};
                    Cursor cursor = getContentResolver().query(localImagemSelecionada, filePath, null, null,null);
                    cursor.moveToFirst();
                    String mImagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));

                   imagem = imageTreatment(SELECAO_GALERIA, mImagePath);

                    listPath.add(mImagePath);
                    Log.d("Path", "onClick: " + listPath);
                    break;
                }

                if (imagem!= null){
                    imagemConfigurada = new Image();
                    imagemConfigurada.setImage(imagem);
                    listImagens.add(imagemConfigurada);
                    Log.d("Imagem", "onActivityResult: " + listImagens);
                    adapter.notifyDataSetChanged();
                }
                textQtdImagem.setText("Você adicionou " + listImagens.size() + " de 6 imagens");
                textQtdImagem.setGravity(Gravity.CENTER_HORIZONTAL);



  }catch (Exception e){
            e.printStackTrace();
        }

    }
}


private Bitmap imageTreatment(int requestCode String path){

        Bitmap bitmap = null;

        //Usado para o Scale Factor:
        final float scale = getResources().getDisplayMetrics().density;
        int padding_150dp = (int) (150 * scale + 0.5f);
        int targetImageViewWidth = padding_150dp;
        int targetImageViewHeight = padding_150dp;


        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        if (requestCode == SELECAO_CAMERA){
            try {
                bitmap = BitmapFactory.decodeFile(path, bmOptions);
            int cameraImageWidth = bmOptions.outWidth;
            int cameraImageHeight = bmOptions.outHeight;
            int scaleFactor = Math.min(cameraImageWidth / targetImageViewWidth, cameraImageHeight / targetImageViewHeight);
            Log.d("scale", "imageTreatment: " + scaleFactor);
            bmOptions.inSampleSize = scaleFactor;
            bmOptions.inJustDecodeBounds = false;
            bitmap = BitmapFactory.decodeFile(path, bmOptions);
            Log.d("bitmap", "imageTreatment: " + bitmap);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else {
            try {
                bitmap = BitmapFactory.decodeFile(path, bmOptions);
                int cameraImageWidth = bmOptions.outWidth;
                int cameraImageHeight = bmOptions.outHeight;
                int scaleFactor = Math.min(cameraImageWidth/targetImageViewWidth, cameraImageHeight/targetImageViewHeight);
                Log.d("scale", "imageTreatment: " + scaleFactor);
                bmOptions.inSampleSize = scaleFactor;
                bmOptions.inJustDecodeBounds = false;
                bitmap = BitmapFactory.decodeFile(path, bmOptions);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        //orientation:
        try {
            int rotate = 0;
            try {
                ExifInterface exif = new ExifInterface(path);
                int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

                switch (orientation){
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotate = 270;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotate = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotate = 90;
                        break;
                }

            }catch (Exception e){
                e.printStackTrace();
            }
            Matrix matrix = new Matrix();
            matrix.postRotate(rotate);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        }catch (Exception e){
            e.printStackTrace();
        }

        return bitmap;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...