получение изображения из галереи, но больше, чем 3 МБ, изображение не загружается в режиме просмотра изображений - PullRequest
0 голосов
/ 13 мая 2018

небольшие изображения загружаются успешно, но большие изображения e, g больше 3 МБ не загружаются в режиме просмотра изображений.Я также снимаю изображение с камеры, оно работает нормально, но из галереи оно не загружается в режиме просмотра изображений и остается пустым. Я не знаю, как решить эту проблему

 public void gallery() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, PHOTO_FROM_MEMORY_REQUESTED);
}
 private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode== REQUEST_IMAGE_CAPTURE) {
        try {
            if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
                Bundle extras = data.getExtras();
                Bitmap imageBitmap = (Bitmap) extras.get("data");
                iv.setImageBitmap(imageBitmap);
                image = encode(imageBitmap);//this line is added to encode
            }
        }
        catch (Exception e){ Toast.makeText(DoReport.this, e.toString(), Toast.LENGTH_LONG).show();}
    }
    else if (requestCode == PHOTO_FROM_MEMORY_REQUESTED && resultCode == RESULT_OK) {
        updateSelectedPicture(data.getData());
    }

}
 private void updateSelectedPicture(Uri uri){
    try{
        imageUri = uri;
        InputStream imageStream = getContentResolver().openInputStream(imageUri);
        selectedImage = BitmapFactory.decodeStream(imageStream);
        iv.setImageDrawable(new BitmapDrawable(selectedImage));
        image=encode(selectedImage);

    }catch(FileNotFoundException ex){

        Log.e("File not found", "Cannot find background file under received URI");
    }
}
public static String encode(Bitmap image)
{
    Bitmap immagex=image;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    immagex.compress(Bitmap.CompressFormat.JPEG, 20, baos);
    byte[] b = baos.toByteArray();
    String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);

    Log.e("LOOK", imageEncoded);
    return imageEncoded;
}

// вот код xml

 <ImageView
    android:layout_marginLeft="5dp"

    android:layout_width="350dp"
    android:layout_height="197dp"
    android:maxWidth="100dp"
    android:maxHeight="100dp"
    android:layout_below="@+id/toolbar"
    android:id="@+id/ImgView"
    android:layout_centerHorizontal="true"/>

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Потому что вы не можете просто использовать изображение из галереи или камеры как есть. Вы должны сжать это изображение перед выполнением какой-либо операции ( 3 МБ - большие данные, и теперь мобильные телефоны имеют 5 МБ> изображение также ).

  • Вы сожмете изображение после получения его URI.

Для этого введите описание ссылки здесь проделал большую работу. Вы просто будете использовать простые методы этой библиотеки.

Добавить это на уровень приложения Build.gradle

dependencies {
    compile 'id.zelory:compressor:2.1.0'
}

и простой метод

Сжать файл изображения

compressedImageFile = new Compressor(this).compressToFile(actualImageFile);

Сжать файл изображения в растровое изображение

compressedImageBitmap = new Compressor(this).compressToBitmap(actualImageFile);

Смотрите на изображении ниже, этот метод сжатия изображений великолепно сжимает ваше изображение. Который выглядит все так же с большой разницей в размерах.

demo

0 голосов
/ 13 мая 2018

Попробуйте <application android:largeHeap="true"</application>, и я также предлагаю Пикассо для работы с изображениями.

0 голосов
/ 13 мая 2018

Помните, что у вашего приложения есть ограничение кучи, которое отличается на разных устройствах. Чтобы уменьшить размер изображения, вы можете сжать его:

Bitmap original; // the original bitmap you want to compress
ByteArrayOutputStream out = new ByteArrayOutputStream();
original.compress(Bitmap.CompressFormat.PNG, VALUE, out);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray())); 

Где VALUE - это целое число от 0 до 100. 0 представляет максимальное сжатие (минимальное качество).

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