File Jpeg重新启动标记

File Jpeg重新启动标记,file,jpeg,huffman-code,decoder,File,Jpeg,Huffman Code,Decoder,我制作了jpeg解码器,但没有实现重启标记逻辑。这就是为什么我的程序不能处理某些图像的原因(例如,使用Photoshop:File->Save As->jpeg保存的图像)。我想实现重启标记逻辑,但并没有详细的在线解释重启标记逻辑是如何工作的。请任何人告诉我有关重启标记的更多信息,或者建议我在线资源,我可以在那里阅读更多关于重启标记的信息。谢谢 重启标记非常简单。它们被设计为允许在发生错误后重新同步。由于大多数JPEG图像是通过无错误的通道传输的,因此很少需要它们。使用FFDD标记将重新启动间隔

我制作了jpeg解码器,但没有实现重启标记逻辑。这就是为什么我的程序不能处理某些图像的原因(例如,使用Photoshop:File->Save As->jpeg保存的图像)。我想实现重启标记逻辑,但并没有详细的在线解释重启标记逻辑是如何工作的。请任何人告诉我有关重启标记的更多信息,或者建议我在线资源,我可以在那里阅读更多关于重启标记的信息。谢谢

重启标记非常简单。它们被设计为允许在发生错误后重新同步。由于大多数JPEG图像是通过无错误的通道传输的,因此很少需要它们。使用FFDD标记将重新启动间隔定义为2字节的数字。这说明重启标记之间有多少MCU。当遇到重新启动标记(FFD0-FFD7)时,将DC值(Y、Cr、Cb)重置为0,并在字节边界上(FFDx之后)启动位流。这只是一个简单的问题,通过重新启动间隔计数一遍又一遍,因为你解码的图像。重新启动标记值将从FFD0增加到FFD7,然后在FFD0再次启动。标记值本身并不十分重要,但它可以指示是否缺少大块数据。下面是一个如何在解码器中执行此操作的示例。我扔掉了我的比特流阅读器中的重启标记

iRestartCount = iRestartInterval;
for (y=0; y<Height_in_MCUs; y++)
   {
   for (x=0; x<Width_in_MCUs; x++)
       {
       <decode an MCU>
       if (iRestartInterval) // if there is a restart interval defined
          {
          if (--iRestartCount == 0)
             {
             iRestartCount = iRestartInterval; // reset restart inverval counter
             iDCPred0 = iDCPred1 = iDCPred2 = 0; // reset DC predictors
             if (*iBit & 7) // adjust bitstream to start on the next byte boundary
                {
                *iBit += (8 - (*iBit & 7));
                }
             } // if restart interval expired
          } // if restart interval defined
       } // for x
    } // for y
iRestartCount=iRestartInterval;

对于(y=0;y请您告诉我更多的实现细节和逻辑?如果它是一个具有交错的多分量映像呢?@adikshit-据我所知,无论配置如何,重新启动间隔都是指MCU(最小编码单元)。对于三分量彩色映像(y/Cb/Cr),重新启动间隔指3个DCT块的组。例如,间隔100意味着300个DCT块(100 MCU).@afuna重新启动间隔是一个字值,因为每个图像的MCU大小是固定的。重新启动标记是一个单字节,其模8值指示序列号,以便可以检测到数据丢失。@afuna当然,对于可变长度编码数据,您不知道每个MCU的确切字节偏移量,但是因为所有标记字节都以FF开头,所以向前扫描查找它们既快捷又容易。