30天自制操作系统吧 关注:1,380贴子:4,763
  • 10回复贴,共1

没想到作者一笔带过的jpeg格式这么复杂

取消只看楼主收藏回复

高考完了,研究了一下jpeg格式,属于一边学rust一边学jpeg了。我发现这方面网上完整的中文资料很是稀缺,虽然能搜到很多文章,但都是不完整的,搞得我花了大量的时间去研究MCU、Block、FrameComponent、ScanComponent之间的关系,陆陆续续花了我半个月的时间。最终终于写出了一个简单的、作用有些的、甚至解码出的图形还有些问题的jpeg查看器。目前只支持BaselineDCT(SOF0),YCbCr色彩的jpeg图片查看器。
我怀疑解码的问题出在了IDCT变换或者DC Diff解码上,有没有懂得指点一下


IP属地:澳大利亚来自Android客户端1楼2024-07-10 00:49回复
    上面的图可能看不清楚解码出的图像的问题,我放个大的


    IP属地:澳大利亚来自Android客户端2楼2024-07-10 00:53
    回复
      重新想了一下,好像也可能是我写的yuv420到444转换的逻辑有问题


      IP属地:澳大利亚来自Android客户端3楼2024-07-10 00:56
      回复
        破案了,我在MCU内采样CbCr分量的时候忘记加上偏移量了


        IP属地:澳大利亚4楼2024-07-10 17:17
        回复
          有花了点时间把书上的那副图给解码出来了。因为这个图中有DRI段和RST标记,JPEGSnoop等一些软件识别不了,导致调试起来很麻烦,最终还是搞定了


          IP属地:澳大利亚5楼2024-07-10 21:45
          回复
            因为我电脑上一共就找出了这两个jpg图片(以前都没注意其他这么多图片居然都是png),去网上下了一个本书的封面图测试。然后华丽的失败了。。。又花了一天的时间找bug
            不过这个图片足足有105KB大(其实不大,但是我写的效率比较低),从启动到显示出来需要8秒左右,还是在我尝试用avx加速idct的情况下,不过我也是第一次用simd,应该还能优化


            IP属地:澳大利亚6楼2024-07-12 00:18
            回复
              看了下火焰图发现问题所在了,我调试时放的测试输出忘记删了,占用了大量时间(我说怎么CPU占用几乎为0),删掉直接性能提升96%


              IP属地:澳大利亚7楼2024-07-12 09:54
              回复
                软件已以GPLv3协议开源
                Github:https://github.com/Ryan1202/my-tiny-jpeg-viewer


                IP属地:澳大利亚9楼2024-07-18 13:38
                回复
                  花了一天的时间研究把YCbCr转换成RGB的部分用SSE加速,折磨死我了
                  不过提升巨大,从70+ms减到了39ms


                  IP属地:澳大利亚11楼2024-07-21 21:28
                  回复
                    把HashMap换成了更快的FxHashMap有提升了一点速度


                    IP属地:澳大利亚12楼2024-07-21 21:40
                    回复
                      刚才想到一个很坑爹的点,就是我之前碰到的好几张jpg图片dqt和dht分布千奇百怪,有的一个段对应一个,有的一个段里好几个。翻了JPEG标准才知道原来标准允许这样存


                      IP属地:澳大利亚来自Android客户端13楼2024-08-13 17:58
                      回复