Android Room получить изображение blob и показать

Я использую постоянную библиотеку Room для хранения изображений в формате Blob.

@Entity(tableName = AppConstants.TABLE_OBSERVATIONS_IMAGE)
public class ImageModel {

    @ColumnInfo(typeAffinity = ColumnInfo.BLOB)
    public byte[] image;

    public ImageModel() {
    }

    @Ignore
    public ImageModel(  byte[] image ) {
         this.image = image;
        }

   public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

}

Теперь я хочу получить его и показать в виде изображения. Но это исключение. Я использую следующий код для отображения изображения, где model.getImage () - это изображение, которое я сохранил. Но он возвращает нулевое растровое изображение и вызывает сбой приложения.

ImageModel model = observationModelArrayList.get(position).getImageModels().get(i);
ImageView image = new ImageView(context);
image.setLayoutParams(new android.view.ViewGroup.LayoutParams(100, 100));
image.setMaxHeight(100);
image.setMaxWidth(100);

Bitmap bmp = BitmapFactory.decodeByteArray(model.getImage(), 0, model.getImage().length);
//ImageView image = (ImageView) findViewById(R.id.imageView1);

image.setImageBitmap(Bitmap.createScaledBitmap(bmp, image.getWidth(), image.getHeight(), false));

// Adds the view to the layout
holder.llayImages.addView(image);

Пожалуйста помоги.

Проверьте, правильно ли BLOB хранится в db. Кстати, BLOB имеет ограничение в 1 Мб, возможно, больший размер изображения также может быть проблемой.

Jeel Vankhede 08.10.2018 13:44

Я вижу изображение в формате байтового массива. позвольте мне попробовать с небольшими изображениями.

Himanshu Shekher Jha 08.10.2018 13:46

Я предлагаю хранить изображение в файловом хранилище и вместо этого отслеживать его путь в db.

Jeel Vankhede 08.10.2018 13:47

@JeelVankhede, да. Я сделаю это по твоему предложению. Но перед этим я ищу еще несколько решений.

Himanshu Shekher Jha 08.10.2018 14:04
0
4
4 298
1

Ответы 1

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

private void loadImage(String path){
  try {
    File file = new File(path, "profile.jpg");
    Bitmap b = BitmapFactory.decodeStream(new FileInputStream(file));
        ImageView img=(ImageView)findViewById(R.id.imgPicker);
    img.setImageBitmap(b); // it will display the image in imageview
    String file_path = saveToInternalStorage(b); // store this file_path in db 
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  }
}

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

GlideApp.with(context)
    .asBitmap()
    .load(url)
    .into(new SimpleTarget<Bitmap>() {
      @Override public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
        String file_path = saveToInternalStorage(resource);  // store the bitmap
        // save this file_path to your db
      }
    });

для сохранения изображения вы можете использовать этот метод

private String saveToInternalStorage(Bitmap bitmapImage){
    ContextWrapper cw = new ContextWrapper(getApplicationContext());
     // path to /data/data/yourapp/app_data/imageDir
    File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
    // Create imageDir
    File mypath=new File(directory,"profile.jpg");

    FileOutputStream fos = null;
    try {           
        fos = new FileOutputStream(mypath);
   // Use the compress method on the BitMap object to write image to the OutputStream
        bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
    } catch (Exception e) {
          e.printStackTrace();
    } finally {
        try {
          fos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
    } 
    return mypath.getAbsolutePath();
}

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

Другие вопросы по теме