首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.lang.IllegalStateException:无法执行getPixels(),Config#HARDWARE位图不支持像素访问

java.lang.IllegalStateException:无法执行getPixels(),Config#HARDWARE位图不支持像素访问
EN

Stack Overflow用户
提问于 2020-02-29 15:14:00
回答 3查看 1.5K关注 0票数 9

我正在使用调色板从位图中获取vibrantSwatch颜色。

要在我写这段代码之前从uri获取位图(在API29中,getBitmap已经发布了):

代码语言:javascript
复制
Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(),
    Uri.fromFile(ImageModelArrayList.get(position).getImageUri()));

为了方便起见,我现在写了这段代码来获取位图:

代码语言:javascript
复制
 ImageDecoder.Source source = ImageDecoder.createSource(context.getContentResolver(),
                    Uri.fromFile(ImageModelArrayList.get(position).getImageUri()));
            Bitmap bitmap = ImageDecoder.decodeBitmap(source);

现在,在这个调色板代码中,我遇到了崩溃(如果我使用getBitmap,没有问题。如果我使用ImageDecoder,我会崩溃):

代码语言:javascript
复制
Palette p = createPaletteSync(bitmap);
            Palette.Swatch vibrantSwatch = p.getDominantSwatch();
            Log.d(TAG, "onBindViewHolder: vibrantSwatch " + vibrantSwatch);
            if (vibrantSwatch != null) {
                holder.constraintLayout.setBackgroundColor(vibrantSwatch.getRgb());
            }

错误:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2020-06-27 16:44:37

您可以将位图复制到可变的位图,这并不理想,但它是有效的:

代码语言:javascript
复制
ImageDecoder.decodeBitmap(source).copy(Bitmap.Config.RGBA_F16, true)
票数 10
EN

Stack Overflow用户

发布于 2021-04-14 10:42:27

默认情况下,ImageDecoder.decodeBitmap()返回不可变的位图。并且像素存储器的默认分配是HARDWARE,但是在存在小图像的情况下或者当software不兼容时,可以切换到HARDWARE。(More info)

要获得可变的位图,可以设置isMutableRequired = true。但是当分配是HARDWARE时,位图是不可变的,所以首先你需要改变解码器的分配。

您可以使用OnHeaderDecodedListener处理其他decodeBitmap()重载。

代码语言:javascript
复制
var mutableBitmap = ImageDecoder.decodeBitmap(
                    source,
                    ImageDecoder.OnHeaderDecodedListener { decoder, info, source ->
                        decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE
                        decoder.isMutableRequired = true
                    })
票数 1
EN

Stack Overflow用户

发布于 2021-10-03 13:20:58

在合成和卷绕中:

代码语言:javascript
复制
import coil.compose.rememberImagePainter

val imagePainter = rememberImagePainter(
                    data = product.imageUrl,
                    builder = {
                        crossfade(true)
                        placeholder(R.drawable.ic_placeholder)
                        allowHardware(false) //IMPORTANT!
                    }
                )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60462841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档