И снова я
Функция получения ширины/высоты графического файла формата 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 - высота
Здравствуйте, Flamer, Вы писали:
Не все определяются корректно.
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:
if (bBuf[1]==0)//нужно добавить
bExitFlag=true;
break;
... << RSDN@Home 1.1.4 207 >>
Еще одно дополнение
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:
if ((bBuf[1]==0)&&(bBuf[2]==17))//нужно добавить
bExitFlag=true;
break;
... << RSDN@Home 1.1.4 207 >>