V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
lfflyers
V2EX  ›  iDev

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

  •  1
     
  •   lfflyers · 2016-04-28 17:53:47 +08:00 · 3298 次点击
    这是一个创建于 3139 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    + (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;
            }
        }
    }
    
    12 条回复    2016-04-29 19:16:11 +08:00
    sutra
        1
    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
    CDuXZMAPgHp1q9ew
        2
    CDuXZMAPgHp1q9ew  
       2016-04-28 18:36:40 +08:00
    lz 要的大小是图片宽高 不是文件大小
    可以通过只读 jpg 的前几个字节来确认大小 有个现成的库 不记得了....
    xiaket
        3
    xiaket  
       2016-04-28 18:42:50 +08:00
    嗯, 思路很简单, HTTP 加一个 range 的 header, 读前几个字节, 解出相关信息就行.
    lfflyers
        4
    lfflyers  
    OP
       2016-04-29 09:12:08 +08:00
    @sutra 用 OC 代码可以实现吗?
    lfflyers
        5
    lfflyers  
    OP
       2016-04-29 09:12:51 +08:00
    @wujichao 还有这样的库?
    lfflyers
        6
    lfflyers  
    OP
       2016-04-29 09:13:44 +08:00
    @xiaket 好像我上面贴的那段代码就是这么去实现的,但是得到的不准确
    CDuXZMAPgHp1q9ew
        7
    CDuXZMAPgHp1q9ew  
       2016-04-29 09:49:11 +08:00
    CDuXZMAPgHp1q9ew
        8
    CDuXZMAPgHp1q9ew  
       2016-04-29 09:50:29 +08:00   ❤️ 1
    lfflyers
        9
    lfflyers  
    OP
       2016-04-29 11:17:31 +08:00
    @wujichao 非常感谢,我试试
    kkzxak47
        10
    kkzxak47  
       2016-04-29 13:43:15 +08:00
    平时也经常处理图片,发现很多 jpg 扩展名的文件实际上存的是 png/gif ……
    所以要想最靠谱还是自己读文件头,判定真实文件格式,再根据不同格式去找高宽怎么存的
    lfflyers
        11
    lfflyers  
    OP
       2016-04-29 14:46:48 +08:00
    @kkzxak47 这个怎么读?对这种图片文件头的格式一点都不懂
    xiaket
        12
    xiaket  
       2016-04-29 19:16:11 +08:00
    @lfflyers 关键字 /思路都给到了, 不懂就找资料看嘛~ 程序员不踩坑天天用别人的库哪来的提高~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2674 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:17 · PVG 19:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.