解码器中可能存在的边缘情况,即非常首个 OP 为 QOI_OP_RUN
作者: phoboslab创建于 2023年1月23日更新于 2025年12月12日
正如 @andrews05 最近指出的那样,QOI 文件中存在一个边缘情况,不同的解码器可能对其处理方式不同。 这个边缘情况可能会导致完全不透明的黑色图像显示为透明的背景。 这种情况可能会发生在将 QOI 文件解码为 RGBA(4 通道)时,如果 QOI 文件的第一个 OP 是 QOI_OP_RUN,则会重复最初的不透明黑色像素。 有些解码器在这种情况下会忽略将最初的黑色像素放入索引中。 图像中稍后,解码器可能会参考该索引位置,该位置应该存储不透明的黑色像素,但实际是空的 - 即来自零初始化索引的最初透明黑色像素。 如规范中指出的,虽然不是非常明确:
每个 由编码器和解码器看到的像素都会被放入此数组中,位置由颜色值的哈希函数生成。 ... 如果第一个 OP 是
QOI_OP_RUN,则必须包括最初的不透明黑色像素。 我已经更新了 qoi_test_images.zip,添加了一个包含此边缘情况的图像,名为edgecase.qoi。 正如 @andrews05 进一步指出的那样,此仓库中的 参考编码器 不会生成具有此边缘情况的 QOI 图像(它从不以QOI_OP_RUN开始一个 QOI 文件),但其他编码器可能会。 经过阅读本 README 中列出的解码器后,我发现了一些实现没有按照规范处理此边缘情况 - 再次,我要道歉,这不是最清晰的表述。 我现在将通知这些实现。 再次感谢 @andrews05 指出了这个问题。
内容来源: phoboslab/qoi