SRC: Получение ширины/высоты JPEG-файла
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 31.07.02 08:56
Оценка: 20 (3)
И снова я

Функция получения ширины/высоты графического файла формата JPEG (*.jpg, *.jpeg):


//---------------------------------------------------------------------------
long Mult(BYTE lsb, BYTE msb){
    return (lsb + (msb * 256) );
}
//---------------------------------------------------------------------------
bool GetJpegDim(const char* FileName, int& Width, int& Height)
{

Width = Height = -1;

FILE* hFile = fopen(FileName,"rb");
if(!hFile) return false;


long lPos=0;
unsigned char bBuf[3]={0};
bool bMarkerFound=false;
bool bExitFlag=false;

while(1) {

   if(feof(hFile)) {
       fclose(hFile); return false;
       }

   if(!fread(bBuf,3,1,hFile)) {
      fclose(hFile); return false;
      }

     if(bBuf[0] == 0xFF && bBuf[1] == 0xD8 && bBuf[2] == 0xFF) {
      bMarkerFound=true; break; // нашли нужный маркер
      }

     if(fseek(hFile,lPos+1,SEEK_SET)!=0) {
          fclose(hFile);return false;
         }

    lPos = ftell(hFile);
    if(lPos==-1L) {
        fclose(hFile); return false;
        }

}//while

if(!bMarkerFound) { // маркер не найден - возможно, это вовсе не JPEG
    fclose(hFile);
    return false;
    }

if(fseek(hFile,lPos+2,SEEK_SET)!=0) {
     fclose(hFile);return false;
     }

  lPos = ftell(hFile);
     if(lPos==-1L) {
         fclose(hFile); return false;
        }

while(1) {

     if(feof(hFile)) {
             fclose(hFile); return false;
     }

   while(1) {

       if(feof(hFile)) {
             fclose(hFile); return false;
                 }

     if(!fread(bBuf,2,1,hFile)) {
              fclose(hFile); return false;
          }

             if( bBuf[0] == 0xFF && bBuf[1] != 0xFF) break;
             if(fseek(hFile,lPos+1,SEEK_SET)!=0) {
                  fclose(hFile);return false;
                 }
                 lPos = ftell(hFile);
         if(lPos==-1L) {
                   fclose(hFile); return false;
          }


     } //while

    if(fseek(hFile,lPos+1,SEEK_SET)!=0) {
        fclose(hFile);return false;
        }

   lPos = ftell(hFile);
    if(lPos==-1L) {
         fclose(hFile); return false;
        }


   if(!fread(bBuf,3,1,hFile)) {
      fclose(hFile); return false;

      }

            switch (bBuf[0]) {

                case 0xC0:
                case 0xC1:
                case 0xC2:
                case 0xC3:
                case 0xC5:
                case 0xC6:
                case 0xC7:
                case 0xC9:
                case 0xCA:
                case 0xCB:
                case 0xCD:
                case 0xCE:
                case 0xCF:
                     bExitFlag=true;
                    break;
            }
            if(bExitFlag)break;
            if(fseek(hFile,lPos + Mult(bBuf[2], bBuf[1]),SEEK_SET)!=0) {
             fclose(hFile);return false;
            }
            lPos = ftell(hFile);

            if(lPos == -1L) {
                fclose(hFile);
                return false;
                }


} //while

if(fseek(hFile,lPos + 4,SEEK_SET)!=0) {
       fclose(hFile);return false;
       }

if(fread(bBuf,2,1,hFile)) {

        //получаем высоту
        Height = Mult(bBuf[1], bBuf[0]);

   if(fread(bBuf,2,1,hFile)) {

        //получаем ширину
        Width = Mult(bBuf[1], bBuf[0]);
       }
}


fclose(hFile);
return true;
}
//---------------------------------------------------------------------------


Пример использования:



int Width, Height;
GetJpegDim("C:\\test.jpg",Width,Height); // в Width - ширина, в Height - высота
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.