Слишком большое изображение Пробовал все - PullRequest
0 голосов
/ 31 августа 2018

Ребята, я сталкиваюсь с этой проблемой уже 2 дня подряд. Я хочу выбрать изображение из галереи и преобразовать его в метод Base64. Я пробовал Пикассо, но мое изображение очень большое. Не могли бы вы мне помочь. Я перепробовал все, но мне не хватает памяти при преобразовании в растровое изображение, а затем в base64.

BitmapDrawable drawable = (BitmapDrawable) ProfilePic.getDrawable();
                            yourSelectedIBitmapDrawable drawable = (BitmapDrawable) ProfilePic.getDrawable();
                            yourSelectedImage = drawable.getBitmap();mage = drawable.getBitmap();

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

private String encodeToBase64(Bitmap image) {

        Bitmap immagex = image;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();
        String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
        //Log.e("LOOK", imageEncoded);
        return imageEncoded;
    }

Profile Pic - это имя Imageview.

РЕДАКТИРОВАТЬ : Таким образом, один из способов - использовать большую кучу, но Google говорит, что вы не должны использовать это без крайней необходимости. Другой, который работал для меня, является принятым ответом. Теперь я придумал собственное решение. Теоретически я использую Пикассо для загрузки изображения в вид изображения. Так что, если я могу извлечь изображение из ImageView. Не из URI или пути, но из Imageview. Таким образом, у вас есть изображение, которое уже уменьшено Пикассо. Picasso предоставляет обратный вызов для успеха или неудачи. Таким образом, в случае успеха вы можете получить доступ к кэш-памяти ImageView и извлечь из нее битовую карту.

Я скоро опубликую код в качестве ответа. Я попробовал это сделать, и даже изображение размером 35 Мб изначально можно преобразовать в растровое изображение без исключения «Недостаточно памяти».

Итак, вот мой ответ: https://stackoverflow.com/a/52125006/6022584

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Это мой Код, который работал. Для меня новый выпуск - это название Activity

if (requestCode == PICK_IMAGE) {
            if(resultCode == RESULT_OK){
                //isImageFromGallery = true;
                //isImageSelected = true;
                ImagePath = data.getData();

                Picasso.get()
                        .load(ImagePath)
                        .resize(1024,1024)
                        .onlyScaleDown()
                        .centerCrop()
                        .into(picture, new Callback(){
                            @Override
                            public void onSuccess() {
                                BitmapDrawable drawable = (BitmapDrawable) picture.getDrawable();
                                yourSelectedImage = drawable.getBitmap();
                                //isImageSelected = true;

                                Log.d("FileSize",Formatter.formatFileSize(NewIssue.this,
                                        yourSelectedImage.getByteCount()));
                            }

                            @Override
                            public void onError(Exception e) {
                                Toast.makeText(NewIssue.this, "Could Not Load Image", Toast.LENGTH_SHORT).show();
                            }
                        });

            }
        }
0 голосов
/ 31 августа 2018

Вы можете попробовать прочитать растровые данные с помощью буфера. Примерно так:

private String encodeToBase64(Bitmap image) {
  // get an InputStream
  ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  image.compress(CompressFormat.PNG, 0, baos); 
  byte[] bitmapdata = baos.toByteArray();
  ByteArrayInputStream bais = new ByteArrayInputStream(bitmapdata);

  // prepare a buffer to read the inputStream
  byte[] buffer = new byte[10 * ONE_KIO];  // ONE_KIO = 1024
  int bytesRead;

  // prepare the stream to encode in Base64
  ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  Base64OutputStream base64OutputStream = new Base64OutputStream(outputStream, Base64.DEFAULT);

  // read the inputStream
  while ((bytesRead = bais.read(buffer)) != -1) {
    base64OutputStream.write(buffer, 0, bytesRead);
  }
  base64OutputStream.close();

  // get the encoded result string
  return outputStream.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...