在啥情况下 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.decodeStream
从InputStream
解码位图,并且我想在ARGB_8888
中接收位图,所以我使用了BitmapFactory.Options.inPreferredConfig = ARGB_8888
,但我的一些用户设法加载了位图在不同的配置 (RGBA_F16
) 中,考虑到该字段的名称是 Preferred 的事实,这是有道理的,但这是为什么呢?什么情况下android无法在inPreferredConfig
中加载位图?源代码对此不是很清楚。我的解决方案是使用Bitmap.copy
或Canvas.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?
在啥情况下 [NSDocument fileURL] 可以为零?