How to get the width/height of jpeg file without using library?

后端 未结 7 1512
清歌不尽
清歌不尽 2020-12-25 08:43

Firstly I want to say I tried many times to find the answer by using google search, and I found many results but I did not understand, because I don\'t know the idea of read

7条回答
  •  时光说笑
    2020-12-25 09:04

    Here's some simple code I wrote which seems to work reliably.

    #define MOTOSHORT(p) ((*(p))<<8) + *(p+1)
    unsigned char cBuf[32];
    int iBytes, i, j, iMarker, iFilesize;
    unsigned char ucSubSample;
    int iBpp, iHeight, iWidth;
    
             Seek(iHandle, 0, 0); // read the first 32 bytes
             iBytes = Read(iHandle, cBuf, 32);
    
             i = j = 2; /* Start at offset of first marker */
             iMarker = 0; /* Search for SOF (start of frame) marker */
             while (i < 32 && iMarker != 0xffc0 && j < iFileSize)
                {
                iMarker = MOTOSHORT(&cBuf[i]) & 0xfffc;
                if (iMarker < 0xff00) // invalid marker, could be generated by "Arles Image Web Page Creator" or Accusoft
                   {
                   i += 2;
                   continue; // skip 2 bytes and try to resync
                   }
                if (iMarker == 0xffc0) // the one we're looking for
                   break;
                j += 2 + MOTOSHORT(&cBuf[i+2]); /* Skip to next marker */
                if (j < iFileSize) // need to read more
                   {
                   Seek(iHandle, j, 0); // read some more
                   iBytes = Read(iHandle, cBuf, 32);
                   i = 0;
                   }
                else // error, abort
                   break;
                } // while
             if (iMarker != 0xffc0)
                goto process_exit; // error - invalid file?
             else
                {
                iBpp = cBuf[i+4]; // bits per sample
                iHeight = MOTOSHORT(&cBuf[i+5]);
                iWidth = MOTOSHORT(&cBuf[i+7]);
                iBpp = iBpp * cBuf[i+9]; /* Bpp = number of components * bits per sample */
                ucSubSample = cBuf[i+11];
                }
    

提交回复
热议问题