Как получить изменяемое растровое изображение с помощью ImageDecoder?
Я создаю растровое изображение следующим образом
ImageDecoder.Source source = ImageDecoder.createSource(this.getContentResolver(), mSourceUri);
try {
bitmap = ImageDecoder.decodeBitmap(source));
} catch (IOException e) {
e.printStackTrace();
}
Это возвращает неизменяемое растровое изображение. Я видел документацию google и есть методsetMutableRequired()
но я не мог найти, как использовать этот метод. Он не работает с ImageDecoder, а также с исходным кодом
4 ответа
Решение
Немного красивее решение
imageBitmap = imageBitmap.copy(Bitmap.Config.ARGB_8888, true);
Обратитесь к этому ответу
Из API 28
ImageDecoder.Source source = ImageDecoder.createSource(getContentResolver(), imageUri);
ImageDecoder.OnHeaderDecodedListener listener = new ImageDecoder.OnHeaderDecodedListener() {
@Override
public void onHeaderDecoded(@NonNull ImageDecoder decoder, @NonNull ImageDecoder.ImageInfo info, @NonNull ImageDecoder.Source source) {
decoder.setMutableRequired(true);
}
};
bitmap = ImageDecoder.decodeBitmap(source, listener);
Обеспечьте ImageDecoder.OnHeaderDecodedListener
как второй параметр для ImageDecoder.decodeBitmap()
.
Внутри слушателя вы получаете ImageDecoder
, в который вы можете внести желаемые изменения.
ImageDecoder.decodeBitmap(imageSource, (decoder, info, source) -> {
decoder.setMutableRequired(true);
});
Пока не придет правильный ответ на этот вопрос. Любой, у кого такие же трудности, как у меня, может использовать метод BitmapFactory для получения изменяемого растрового изображения.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mSourceUri), null, options);
вдохновленный этим ответом.