翻译:English
Decoder 用于解码图片文件,支持的每一种图片类型都有对应的 Decoder 实现,如下表所示:
Format | Decoder | Dependent modules | Android | iOS | Desktop | Web |
---|---|---|---|---|---|---|
jpeg | BitmapFactoryDecoder | - | ✅ | ❌ | ❌ | ❌ |
jpeg | SkiaDecoder | - | ❌ | ✅ | ✅ | ✅ |
png | BitmapFactoryDecoder | - | ✅ | ❌ | ❌ | ❌ |
png | SkiaDecoder | - | ❌ | ✅ | ✅ | ✅ |
webp | BitmapFactoryDecoder | - | ✅ | ❌ | ❌ | ❌ |
webp | SkiaDecoder | - | ❌ | ✅ | ✅ | ✅ |
bmp | BitmapFactoryDecoder | - | ✅ | ❌ | ❌ | ❌ |
bmp | SkiaDecoder | - | ❌ | ✅ | ✅ | ✅ |
heif | BitmapFactoryDecoder | - | ✅ (API 28) | ❌ | ❌ | ❌ |
avif | BitmapFactoryDecoder | - | ✅ (API 31) | ❌ | ❌ | ❌ |
gif | ImageDecoderGifDecoder | sketch-animated-gif | ✅ (API 28) | ❌ | ❌ | ❌ |
gif | MovieGifDecoder (不支持 resize) |
sketch-animated-gif | ✅ | ❌ | ❌ | ❌ |
gif | SkiaGifDecoder (不支持 resize) |
sketch-animated-gif | ❌ | ✅ | ✅ | ✅ |
gif | KoralGifDecoder | sketch-animated-gif-koral | ✅ | ❌ | ❌ | ❌ |
webp 动图 | ImageDecoderAnimatedWebpDecoder | sketch-animated-webp | ✅ (API 28) | ❌ | ❌ | ❌ |
webp 动图 | SkiaAnimatedWebpDecoder (不支持 resize) |
sketch-animated-webp | ❌ | ✅ | ✅ | ✅ |
heif 动图 | ImageDecoderAnimatedHeifDecoder | sketch-animated-heif | ✅ (API 30) | ❌ | ❌ | ❌ |
svg | SvgDecoder | sketch-svg | ✅ | ✅ (不支持 CSS) |
✅ (不支持 CSS) |
✅ (不支持 CSS) |
视频帧 | VideoFrameDecoder | sketch-video | ✅ | ❌ | ❌ | ❌ |
视频帧 | FFmpegVideoFrameDecoder | sketch-video-ffmpeg | ✅ | ❌ | ❌ | ❌ |
Apk Icon | ApkIconDecoder | sketch-extensions-core | ✅ | ❌ | ❌ | ❌ |
- ApkIconDecoder 在 Android 平台上解码 Apk 文件的图标(了解更多)
- BitmapFactoryDecoder 在 Android 平台上使用 Android 内置的 BitmapFactory 解码图片,它是最后的解码器
- DrawableDecoder 在 Android 平台上解码 vector、shape 等 Android 支持的 xml drawable 图片
- ImageDecoderGifDecoder 在 Android 平台上使用 Android 内置的 ImageDecoder 解码 gif 动图(了解更多)
- KoralGifDecoder 在 Android 平台上使用 koral-- 的 android-gif-drawable 库解码 gif 动图(了解更多)
- MovieGifDecoder 在 Android 平台上使用 Android 内置的 Movie 解码 gif 动图(了解更多)
- SkiaGifDecoder 在非 Android 平台上使用 Skia 内置的 Codec 解码 gif 动图(了解更多)
- ImageDecoderAnimatedHeifDecoder 使用 Android 内置的 ImageDecoder 解码 heif 动图(了解更多)
- SkiaDecoder 在非 Android 平台上使用 Skia 内置的 Image 解码图片,它是最后的解码器
- SvgDecoder 在 Android 平台上使用 BigBadaboom 的 androidsvg 库,在非 Android 平台上使用 Skia 内置的 SVGDOM 解码静态 svg 文件(了解更多)
- ImageDecoderAnimatedWebpDecoder 在 Android 平台上使用 Android 内置的 ImageDecoder 解码 webp 动图(了解更多)
- SkiaAnimatedWebpDecoder 在非 Android 平台上使用 Skia 内置的 Codec 解码 webp 动图(了解更多)
- VideoFrameDecoder 在 Android 平台上使用 Android 内置的 MediaMetadataRetriever 类解码视频文件的帧(了解更多)
- FFmpegVideoFrameDecoder 在 Android 平台上使用 wseemann 的 FFmpegMediaMetadataRetriever 库解码视频帧(了解更多)
Important
上述组件都支持自动注册,你只需要导入即可,无需额外配置,如果你需要手动注册, 请阅读文档:《注册组件》
先实现 Decoder 接口定义你的 Decoder 和它的 Factory
然后参考文档 《注册组件》 注册你的 Decoder 即可
Caution
- 自定义 Decoder 需要应用 ImageRequest 中的很多与图片质量和尺寸相关的属性,例如 size、colorType、colorSpace 等,可参考其它 Decoder 实现
- 如果你的 Decoder 是解码动图的话一定要判断 ImageRequest.disallowAnimatedImage 参数
BitmapColorType 用于设置位图的颜色类型,可选值有:
- FixedColorType:始终使用指定的颜色类型
- LowQualityColorType:优先使用低质量的颜色类型
- Android 平台上 jpeg 图片使用 RGB_565,其它使用默认值
- 非 Android 平台上 jpeg 和 webp 图片使用 RGB_565,其它使用 ARGB_4444
- HighQualityColorType:优先使用高质量的颜色类型
- Android 平台上 API 26 以上使用 RGBA_F16,其它使用默认值
- 非 Android 平台上始终使用 RGBA_F16
示例:
ImageRequest(context, "https://example.com/image.jpg") {
// 在 Android 平台上使用指定的颜色类型
colorType(Bitmap.Config.RGB_565)
// 在非 Android 平台上使用指定的颜色类型
colorType(ColorType.RGBA_F16)
// 优先使用低质量的颜色类型
colorType(LowQualityColorType)
// 优先使用高质量的颜色类型
colorType(HighQualityColorType)
}
BitmapColorSpace 用于设置位图的颜色空间,可选值有:
- FixedColorSpace:始终使用指定的颜色空间
示例:
ImageRequest(context, "https://example.com/image.jpg") {
// 在 Android 平台上使用指定的颜色空间
colorSpace(ColorSpace.Named.DISPLAY_P3)
// 在非 Android 平台上使用指定的颜色空间
colorSpace(ColorSpace.displayP3)
}
preferQualityOverSpeed 用于设置质量优先解码时质量优先,只能在 Android 平台使用。
示例:
ImageRequest(context, "https://example.com/image.jpg") {
preferQualityOverSpeed(true)
}