各位大神们,有没有什么好的方法提前获取到 JPG 格式的网络图片的大小? - V2EX
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 3694 次点击
    这是一个创建于 3510 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    + (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     Solana     5733 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 02:56 PVG 10:56 LAX 18:56 JFK 21:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86