Я использую постоянную библиотеку 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);
Пожалуйста помоги.
Я вижу изображение в формате байтового массива. позвольте мне попробовать с небольшими изображениями.
Я предлагаю хранить изображение в файловом хранилище и вместо этого отслеживать его путь в db.
@JeelVankhede, да. Я сделаю это по твоему предложению. Но перед этим я ищу еще несколько решений.
Вы можете сохранить изображение во внутреннем хранилище, так как ему не требовалось разрешение на загрузку изображения, которое вы можете использовать.
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 для сохранения растрового изображения. после сохранения файла изображения во внутреннем хранилище сохраните путь в своей базе данных, надеюсь, это поможет вам ...
Проверьте, правильно ли BLOB хранится в db. Кстати, BLOB имеет ограничение в 1 Мб, возможно, больший размер изображения также может быть проблемой.