大一第一次大作业-QOI解码编码器
Polaris_Dane · · 个人记录
一天12h直接肝完的奇迹
调试到裂开
https://phoboslab.org/log/2021/11/qoi-fast-lossless-image-compression
https://blog.csdn.net/u013798145/article/details/122094109
https://qoiformat.org/qoi-specification.pdf
参考代码:https://github.com/phoboslab/qoi/blob/master/qoi.h
调试可用:https://tools.acm.sjtu.app/qoi/
首先考虑encode的方式
按优先级排列分别是RUN,INDEX,DIFF,LUMA,RGB,RGBA
对于rgb格式只用前五种,rgba会用到第六种
整体以
第
如果当前像素与前一个像素信息相同,则用RUN(编码开头前两位为
如果不同,会有一个哈希数组记录着前面像素的信息,如果能够找到对应的哈希且具体信息相同(因为可能具体信息不同而哈希相同),则使用INDEX编码(编码开头为
哈希方式为
注意这里处理方式是如果哈希内部的值不同,那么就替换他,实时更新
那么如果不同的话,我们就来到DIFF和LUMA编码
两种方法都是通过该像素和前一个像素的残差来编码的
如果RGB三个通道残差都在
那么就是用DIFF记录(编码开头为
而若不能用DIFF且G通道残差在
且R和B的残差与G的残差之差(前者减后者)在
那么可以使用LUMA(编码为
然后再使用
如果上述都不能使用的话,就只能直接记录rgb,反向压缩(就是没用压缩反而扩大了,因为要打标签)
rgb标签为
除了rgb和rgba编码剩下编码都有不错的平均压缩率,而且压缩效率很快
如果是rgba格式的话,只需要改变一点
即在使用DIFF和LUMA的时候必须要求前后的
所有QOI文件最后会有8个
写的时候注意是按像素个数读入输出还是按压缩后的数量读入输出
这个QOI的初始设计者可能就是想要在模
码风提示(大作业一定要注意):变量名多用下划线使含义清晰
别用逗号表达式,用分号表达式
if条件换行的时候条件对齐