libavif 解码时能否确定 avifRGBFormat?
数据小许
结论
无法从解码后的 AVIF 图像还原编码前使用的 avifRGBFormat。这个格式描述的是 avifRGBImage 内存缓冲区中 RGB 通道的排列方式,是颜色转换时的输入或输出设置,AVIF 文件不会记录编码前的 RGB 布局。
avifImageYUVToRGB(image, &rgb) 按调用方设置的 rgb.format 写入像素,不会推断或设置该格式。avifRGBImageSetDefaults() 会初始化 rgb,默认格式为 AVIF_RGB_FORMAT_RGBA。相关字段和函数定义见 libavif 的 avif.h。
可以检查什么
解码后可以查看 image->yuvFormat,了解图像编码后的 YUV 像素格式,例如是否为 AVIF_PIXEL_FORMAT_YUV400(单色采样)。这个字段能说明解码图像的采样布局,无法证明编码前的 RGB 缓冲区使用过哪种 avifRGBFormat。例如,灰度内容也可能以带色度通道的格式编码。
需要输出 RGB 时,由程序选择目标格式,再执行转换:
avifRGBImage rgb;
avifRGBImageSetDefaults(&rgb, image);
rgb.format = AVIF_RGB_FORMAT_RGBA;
if (avifRGBImageAllocatePixels(&rgb) != AVIF_RESULT_OK) {
/* 处理分配失败 */
}
if (avifImageYUVToRGB(image, &rgb) != AVIF_RESULT_OK) {
/* 处理转换失败 */
}
/* 使用 rgb.pixels 和 rgb.rowBytes */
avifRGBImageFreePixels(&rgb);
如果只需判断解码图像是否为 YUV 4:0
,可以单独检查:bool isMonochrome = (image->yuvFormat == AVIF_PIXEL_FORMAT_YUV400);
alpha 与输出格式
alphaPresent 只能说明图像是否带有 alpha 信息,无法区分 RGB、RGBA、BGRA 等通道排列。输出需要透明度时,选择支持 alpha 的目标 rgb.format;否则可以选择不带 alpha 的格式。具体可用格式请以项目所用 libavif 版本的头文件为准。
备注:内容仅供参考。
