需求情景:同一个文件名可能在多个目录出现,而我要根据尺寸找出所需的那个。
代码:
/*doc: http://www.codingnow.com/2000/download/jpeg.txt*/
static unsigned short read_short(unsigned char **in)
{
unsigned char *ptr = *in;
*in += 2;
return (ptr[0] << 8) | ptr[1];
}
int get_jpeg_size(unsigned char *jpg, int length, int *w, int *h)
{
enum tags{
IMAGE_START=0xffd8,
IMAGE_END = 0xffd9,
SCAN_START = 0xffda,
MODULO_START = 0xffd0,
MODULO_END = 0xffd7,
FRAME_START = 0xffc0,
FRAME_SOF2 = 0xffc2, /*some pic use this*/
};
unsigned char *ptr = jpg, *end = jpg + length;
unsigned short tag, len, width = -1, height = -1;
int found = 0;
if(!jpg || (length < 9+2))return 0;
tag = read_short(&ptr);
if(tag != IMAGE_START)return 0;
while(ptr < end-5){
tag = read_short(&ptr);
len = read_short(&ptr);
if(tag >= MODULO_START && tag <= MODULO_END)continue;
if(tag == SCAN_START)return 0;
if(tag == IMAGE_END)return 0;
if(tag == FRAME_START || tag == FRAME_SOF2){
found = 1;
break;
}
ptr += len-2; /*skip data segment*/
}
if(!found)return 0;
++ptr; /*skip image precision byte*/
height= read_short(&ptr);
width = read_short(&ptr);
*w = width;
*h = height;
return 1;
}
int main(int ac, char **av){
if(ac < 2)return printf("usage: get_jpeg_size in.jpg\n");
FILE *fp = fopen(av[1], "rb");
if(!fp)return printf("can not open %s\n", av[1]);
unsigned char *buf = NULL;
unsigned int size = 0;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);
buf = malloc(size);
fread(buf, 1, size, fp);
int w = 0, h = 0;
get_jpeg_size(buf, size, &w, &h);
printf("size %u width %d height %d", size, w, h);
return 0;
}