在啥情况下 BitmapFactory.Options.inPreferredConfig 不起作用?

Posted

技术标签:

【中文标题】在啥情况下 BitmapFactory.Options.inPreferredConfig 不起作用?【英文标题】:In what cases BitmapFactory.Options.inPreferredConfig not working?在什么情况下 BitmapFactory.Options.inPreferredConfig 不起作用? 【发布时间】:2020-05-11 18:19:47 【问题描述】:

我正在尝试使用BitmapFactory.decodeStreamInputStream 解码位图,并且我想在ARGB_8888 中接收位图,所以我使用了BitmapFactory.Options.inPreferredConfig = ARGB_8888,但我的一些用户设法加载了位图在不同的配置 (RGBA_F16) 中,考虑到该字段的名称是 Preferred 的事实,这是有道理的,但这是为什么呢?什么情况下android无法在inPreferredConfig中加载位图?源代码对此不是很清楚。我的解决方案是使用Bitmap.copyCanvas.drawBitmap 将位图转换为ARGB_8888,但在此之前,我想了解它发生的原因。 谢谢。

【问题讨论】:

您是在控制实际图像,还是来自任意来源(例如,由用户下载)的图像?如果图像可以来自任何地方,则可能是某些图像类型或具有某些属性的图像存在问题。 @CommonsWare 用户可以将图像导入应用程序,所以我无法控制...而且我不认为图像文件已损坏,因为用户可以使用导入向导导入图像工作正常。 我并不是要暗示图像已损坏,只是在某些方面不寻常。 【参考方案1】:

BitmapFactory.Options 的文档描述了inPreferredConfig 的作用是这样的:如果这是非空的,解码器将尝试解码到这个颜色空间。虽然你指定了Bitmap.Config.ARGB_8888,但最终还是会根据图片文件本身进行调整。

The following code 说明了图像的色彩空间是如何确定的:

SkColorType SkAndroidCodec::computeOutputColorType(SkColorType requestedColorType) 
    bool highPrecision = fCodec->getEncodedInfo().bitsPerComponent() > 8;
    switch (requestedColorType) 
        case kARGB_4444_SkColorType:
            return kN32_SkColorType;
        case kN32_SkColorType:
            break;
        case kAlpha_8_SkColorType:
            // Fall through to kGray_8.  Before kGray_8_SkColorType existed,
            // we allowed clients to request kAlpha_8 when they wanted a
            // grayscale decode.
        case kGray_8_SkColorType:
            if (kGray_8_SkColorType == this->getInfo().colorType()) 
                return kGray_8_SkColorType;
            
            break;
        case kRGB_565_SkColorType:
            if (kOpaque_SkAlphaType == this->getInfo().alphaType()) 
                return kRGB_565_SkColorType;
            
            break;
        case kRGBA_F16_SkColorType:
            return kRGBA_F16_SkColorType;
        default:
            break;
    

    // F16 is the Android default for high precision images.
    return highPrecision ? kRGBA_F16_SkColorType : kN32_SkColorType;

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于在啥情况下 BitmapFactory.Options.inPreferredConfig 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在啥情况下 [ [ UIApplication sharedApplication ] keyWindow ] 返回 nil?

在啥情况下 alloca() 有用?

在啥情况下 [NSDocument fileURL] 可以为零?

在啥情况下 eventloop.inEventLoop() == false?

在啥情况下 viewWillAppear 会被调用?

英语:在啥情况下单词后面加s,在啥情况下加es