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

后端 未结 7 1686
清歌不尽
清歌不尽 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:05

    int  GetJpegDimensions(
        char            *pImage,
        size_t          nSize,
        unsigned32      *u32Width,
        unsigned32      *u32Height,
        char            *szErrMsg)
    {
        int             nIndex;
        int             nStartOfFrame;
        int             nError = NO_ERROR;
        bool            markerFound = false;
        unsigned char   ucWord0;
        unsigned char   ucWord1;
    
        // verify START OF IMAGE marker = FF D8
        nIndex = 0;
        ucWord0 = pImage[nIndex];
        ucWord1 = pImage[nIndex+1];
    
        // marker FF D8  starts a valid JPEG
        if ((ucWord0 == 0xFF)  && (ucWord1 == 0xD8))
        {
            // search for START OF FRAME 0  marker  FF C0
            for (nIndex = 2;
                (nIndex < nSize-2) && (markerFound == false);
                 nIndex += 2)
            {
                ucWord0 = pImage[nIndex];
                ucWord1 = pImage[nIndex+1];
                if (ucWord0 == 0xFF)
                {
                    if (ucWord1 == 0xC0)
                    {
                        markerFound = true;
                        nStartOfFrame = nIndex;
                    }
                }
                if (ucWord1 == 0xFF)
                {
                    ucWord0 = pImage[nIndex+2];
                    if (ucWord0 == 0xC0)
                    {
                        markerFound = true;
                        nStartOfFrame = nIndex+1;
                    }
                }
            } // while
    
            if (markerFound)
            {
                nError  = NO_ERROR;
                ucWord0 = pImage[nStartOfFrame+5];
                ucWord1 = pImage[nStartOfFrame+6];
                *u32Height = ucWord1 + (ucWord0 << 8);
    
                ucWord0 = pImage[nStartOfFrame+7];
                ucWord1 = pImage[nStartOfFrame+8];
                *u32Width =  ucWord1 + (ucWord0 << 8);
            }
            else
            {
                // start of frame 0 not found
                nError = -2;
                sprintf(szErrMsg,
                  "Not a valid JPEG image. START OF FRAME 0 marker FFC0 not found");
            }
        }
        else   // START OF IMAGE marker not found
        {
            nError = -1;
            sprintf(szErrMsg,
              "Not a valid JPEG image. START OF IMAGE marker FFD8 not found");
        }
        return nError;
    }
    

提交回复
热议问题