codec 直接读取jpeg文件的尺寸

 需求情景:同一个文件名可能在多个目录出现,而我要根据尺寸找出所需的那个。

代码:

/*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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值