各位大神们,有没有什么好的方法提前获取到 JPG 格式的网络图片的大小?

2016-04-28 17:53:47 +08:00
 lfflyers

以下这段代码似乎没有什么作用,各位大神有没有好的解决方案?

+ (CGSize)downloadJPGImageSizeWithRequest:(NSMutableURLRequest*)request {
    [request setValue:@"bytes=0-209" forHTTPHeaderField:@"Range"];
    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    
    if ([data length] <= 0x58) {
        return CGSizeZero;
    }
    
    if ([data length] < 210) {// 肯定只有一个 DQT 字段
        short w1 = 0, w2 = 0;
        [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
        [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
        short w = (w1 << 8) + w2;
        short h1 = 0, h2 = 0;
        [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
        [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
        short h = (h1 << 8) + h2;
        return CGSizeMake(w, h);
    } else {
        short word = 0x0;
        [data getBytes:&word range:NSMakeRange(0x15, 0x1)];
        if (word == 0xdb) {
            [data getBytes:&word range:NSMakeRange(0x5a, 0x1)];
            if (word == 0xdb) {// 两个 DQT 字段
                short w1 = 0, w2 = 0;
                [data getBytes:&w1 range:NSMakeRange(0xa5, 0x1)];
                [data getBytes:&w2 range:NSMakeRange(0xa6, 0x1)];
                short w = (w1 << 8) + w2;
                short h1 = 0, h2 = 0;
                [data getBytes:&h1 range:NSMakeRange(0xa3, 0x1)];
                [data getBytes:&h2 range:NSMakeRange(0xa4, 0x1)];
                short h = (h1 << 8) + h2;
                return CGSizeMake(w, h);
            } else {// 一个 DQT 字段
                short w1 = 0, w2 = 0;
                [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
                [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
                short w = (w1 << 8) + w2;
                short h1 = 0, h2 = 0;
                [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
                [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
                short h = (h1 << 8) + h2;
                return CGSizeMake(w, h);
            }
        } else {
            return CGSizeZero;
        }
    }
}
3131 次点击
所在节点    iDev
12 条回复
sutra
2016-04-28 18:20:05 +08:00
方法 1. 在获得图片 URL 时的 API 请求中就告知客户端图片的 meta 信息。
方法 2. 使用 HTTP Head 请求:
$ curl -I 'https://www.baidu.com/img/bd_logo1.png'
HTTP/1.1 200 OK
Server: bfe/1.0.8.14
Date: Thu, 28 Apr 2016 10:21:46 GMT
Content-Type: image/png
Content-Length: 7877
Connection: keep-alive
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=0D422F47D99BEF3218B73FC146CF8608:FG=1; expires=Fri, 28-Apr-17 10:21:46 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Wed, 03 Sep 2014 10:00:27 GMT
ETag: "1ec5-502264e2ae4c0"
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Expires: Sun, 26 Apr 2026 10:21:46 GMT
wujichao
2016-04-28 18:36:40 +08:00
lz 要的大小是图片宽高 不是文件大小
可以通过只读 jpg 的前几个字节来确认大小 有个现成的库 不记得了....
xiaket
2016-04-28 18:42:50 +08:00
嗯, 思路很简单, HTTP 加一个 range 的 header, 读前几个字节, 解出相关信息就行.
lfflyers
2016-04-29 09:12:08 +08:00
@sutra 用 OC 代码可以实现吗?
lfflyers
2016-04-29 09:12:51 +08:00
@wujichao 还有这样的库?
lfflyers
2016-04-29 09:13:44 +08:00
@xiaket 好像我上面贴的那段代码就是这么去实现的,但是得到的不准确
wujichao
2016-04-29 09:49:11 +08:00
wujichao
2016-04-29 09:50:29 +08:00
lfflyers
2016-04-29 11:17:31 +08:00
@wujichao 非常感谢,我试试
kkzxak47
2016-04-29 13:43:15 +08:00
平时也经常处理图片,发现很多 jpg 扩展名的文件实际上存的是 png/gif ……
所以要想最靠谱还是自己读文件头,判定真实文件格式,再根据不同格式去找高宽怎么存的
lfflyers
2016-04-29 14:46:48 +08:00
@kkzxak47 这个怎么读?对这种图片文件头的格式一点都不懂
xiaket
2016-04-29 19:16:11 +08:00
@lfflyers 关键字 /思路都给到了, 不懂就找资料看嘛~ 程序员不踩坑天天用别人的库哪来的提高~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/275141

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX