Есть ли способ загрузить изображение как растровое изображение в Glide?
Я ищу способ использовать растровое изображение в качестве входных данных для Glide. Я даже не уверен, возможно ли это. Это для изменения размера. Glide имеет хорошее улучшение изображения с масштабом. Проблема в том, что у меня есть ресурсы в виде растрового изображения, уже загруженные в память. Единственное решение, которое я смог найти, - это сохранить изображения во временном файле и загрузить их обратно в Glide как inputStream/file. Есть ли лучший способ добиться этого?
Пожалуйста, прежде чем ответить.. Я не говорю о выходе из Glide.. .asBitmap().get()
Я знаю это. Мне нужна помощь с вводом.
Вот мое обходное решение:
Bitmap bitmapNew=null;
try {
//
ContextWrapper cw = new ContextWrapper(ctx);
File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
File file=new File(directory,"temp.jpg");
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.close();
//
bitmapNew = Glide
.with(ctx)
.load(file)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into( mActualWidth, mActualHeight - heightText)
.get();
file.delete();
} catch (Exception e) {
Logcat.e( "File not found: " + e.getMessage());
}
Я хотел бы избежать записи изображений во внутреннюю и загружать их снова. По этой причине я спрашиваю, есть ли способ сделать ввод в виде растрового изображения
Спасибо
13 ответов
Действительно странный случай, но давайте попробуем его решить. Я пользуюсь старым и не крутым Picasso
Но однажды я попробую Glide. Вот несколько ссылок, которые могут вам помочь:
- Растровое изображение
- Поддержка темы растровых изображений
- Кто-то также сталкивается с вашей проблемой
И на самом деле жестокий, но я думаю, эффективный способ решить эту проблему:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
yourBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
Glide.with(this)
.load(stream.toByteArray())
.asBitmap()
.error(R.drawable.ic_thumb_placeholder)
.transform(new CircleTransform(this))
.into(imageview);
Я не уверен, поможет ли это вам, но я надеюсь, что это может сделать вас на шаг ближе к решению.
Для версии 4 вы должны позвонить asBitmap()
до load()
GlideApp.with(itemView.getContext())
.asBitmap()
.load(data.getImageUrl())
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {}
});
}
Дополнительная информация: http://bumptech.github.io/glide/doc/targets.html
Это решение работает с Glide V4. Вы можете получить растровое изображение следующим образом:
Bitmap bitmap = Glide
.with(context)
.asBitmap()
.load(uri_File_String_Or_ResourceId)
.submit()
.get();
Примечание: это заблокирует текущий поток для загрузки изображения.
Есть небольшие изменения в соответствии с последней версией Glide
, Теперь нам нужно использовать submit()
загрузить изображение как растровое изображение, если вы не класс submit()
чем слушатель не будет вызван.
Вот рабочий пример, который я использовал сегодня.
<!-- begin snippet: js hide: false console: true babel: false -->
Glide.with(cxt)
.asBitmap().load(imageUrl)
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object o, Target<Bitmap> target, boolean b) {
Toast.makeText(cxt,getResources().getString(R.string.unexpected_error_occurred_try_again),Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onResourceReady(Bitmap bitmap, Object o, Target<Bitmap> target, DataSource dataSource, boolean b) {
zoomImage.setImage(ImageSource.bitmap(bitmap));
return false;
}
}
).submit();
Это работает, и я получаю растровое изображение от слушателя.
Пожалуйста, используйте реализацию для этого:
реализация 'com.github.bumptech.glide:glide:4.9.0'
Glide.with(this)
.asBitmap()
.load("http://url")
.into(new CustomTarget <Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition <? super Bitmap> transition) {
// you can do something with loaded bitmap here
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
Большинство API и методов Glide теперь устарели. Ниже работает для Glide 4.9 и до Android 10.
Для URI изображения
Bitmap bitmap = Glide
.with(context)
.asBitmap()
.load(image_uri_or_drawable_resource_or_file_path)
.submit()
.get();
Используйте Glide, как показано ниже, в build.gradle
implementation 'com.github.bumptech.glide:glide:4.9.0'
Принятый ответ работает для предыдущих версий, но в новых версиях Glide:
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(android.R.drawable.waiting);
requestOptions.error(R.drawable.waiting);
Glide.with(getActivity()).apply(requestOptions).load(imageUrl).into(imageView);
Вот еще одно решение, которое возвращает вам растровое изображение для установки в вашем ImageView
Glide.with(this)
.load(R.drawable.card_front) // you can pass url too
.asBitmap()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
// you can do something with loaded bitmap here
imgView.setImageBitmap(resource);
}
});
Это сработало для меня в последней версии Glide:
Glide.with(this)
.load(bitmap)
.dontTransform()
.into(imageView);
Обновленный ответ 2021 авг.
Glide.with(context)
.asBitmap()
.load(uri)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
useIt(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
onResourceReady : метод, который будет вызываться после завершения загрузки ресурса.
onLoadCleared : обязательный обратный вызов жизненного цикла, который вызывается, когда загрузка отменяется и ее ресурсы освобождаются. Вы должны убедиться, что любой текущий Drawable, полученный вonResourceReady , больше не используется, прежде чем перерисовывать контейнер (обычно View) или изменять его видимость.
Для чего стоит, основываясь на постах выше, мой подход:
Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));
затем в адаптер:
// loading album cover using Glide library
Glide.with(mContext)
.asBitmap()
.load(imageUri)
.into(holder.thumbnail);
на 2021 год:
val bitmap=Glide.with(this).asBitmap().load(imageUri).submit().get()
В Котлине
Glide.with(this)
.asBitmap()
.load("https://...")
.addListener(object : RequestListener<Bitmap> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Bitmap>?,
isFirstResource: Boolean
): Boolean {
Toast.makeText(this@MainActivity, "failed: " + e?.printStackTrace(), Toast.LENGTH_SHORT).show()
return false
}
override fun onResourceReady(
resource: Bitmap?,
model: Any?,
target: Target<Bitmap>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
//image is ready, you can get bitmap here
return false
}
})
.into(imageView)