我正在使用调色板从位图中获取vibrantSwatch颜色。
要在我写这段代码之前从uri获取位图(在API29中,getBitmap已经发布了):
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(),
Uri.fromFile(ImageModelArrayList.get(position).getImageUri()));为了方便起见,我现在写了这段代码来获取位图:
ImageDecoder.Source source = ImageDecoder.createSource(context.getContentResolver(),
Uri.fromFile(ImageModelArrayList.get(position).getImageUri()));
Bitmap bitmap = ImageDecoder.decodeBitmap(source);现在,在这个调色板代码中,我遇到了崩溃(如果我使用getBitmap,没有问题。如果我使用ImageDecoder,我会崩溃):
Palette p = createPaletteSync(bitmap);
Palette.Swatch vibrantSwatch = p.getDominantSwatch();
Log.d(TAG, "onBindViewHolder: vibrantSwatch " + vibrantSwatch);
if (vibrantSwatch != null) {
holder.constraintLayout.setBackgroundColor(vibrantSwatch.getRgb());
}错误:
2020-02-29 12:32:56.722 9865-9865/com.msp.project E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.msp.project, PID: 9865
java.lang.IllegalStateException: unable to getPixels(), pixel access is not supported on Config#HARDWARE bitmaps
at android.graphics.Bitmap.checkHardware(Bitmap.java:401)
at android.graphics.Bitmap.getPixels(Bitmap.java:1760)发布于 2020-06-27 16:44:37
您可以将位图复制到可变的位图,这并不理想,但它是有效的:
ImageDecoder.decodeBitmap(source).copy(Bitmap.Config.RGBA_F16, true)发布于 2021-04-14 10:42:27
默认情况下,ImageDecoder.decodeBitmap()返回不可变的位图。并且像素存储器的默认分配是HARDWARE,但是在存在小图像的情况下或者当software不兼容时,可以切换到HARDWARE。(More info)
要获得可变的位图,可以设置isMutableRequired = true。但是当分配是HARDWARE时,位图是不可变的,所以首先你需要改变解码器的分配。
您可以使用OnHeaderDecodedListener处理其他decodeBitmap()重载。
var mutableBitmap = ImageDecoder.decodeBitmap(
source,
ImageDecoder.OnHeaderDecodedListener { decoder, info, source ->
decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE
decoder.isMutableRequired = true
})发布于 2021-10-03 13:20:58
在合成和卷绕中:
import coil.compose.rememberImagePainter
val imagePainter = rememberImagePainter(
data = product.imageUrl,
builder = {
crossfade(true)
placeholder(R.drawable.ic_placeholder)
allowHardware(false) //IMPORTANT!
}
)https://stackoverflow.com/questions/60462841
复制相似问题