不需要下载图片 获取网络图片大小
2016-09-09 15:21
351 查看
</pre><pre code_snippet_id="1873833" snippet_file_name="blog_20160909_7_5498294" name="code" class="objc">
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 14px; line-height: normal; font-family: Menlo; color: rgb(255, 255, 255); min-height: 16px;"><span style="font-variant-ligatures: no-common-ligatures"></span> </p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 14px; line-height: normal; font-family: Menlo;"><pre name="code" class="objc"><span style="color:#663300;">
static NSString *const kPngRangeValue = @"bytes=16-23"; static NSString *const kJpgRangeValue = @"bytes=0-209";//0-209 static NSString *const kGifRangeValue = @"bytes=6-9"; static NSString *const kHTMLJpgRangeValue = @"bytes=0-1103";//头信息包含HTML的jpg或者其他格式信息的JPG typedef NS_ENUM(NSUInteger, ImageType) { PngImage = 1, JpgImage, GifImage, }; </span>
</pre><pre code_snippet_id="1873833" snippet_file_name="blog_20160909_5_2226671" name="code" class="objc">//同步下载图片的头信息
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:URLString]]; if ([self.picUrl hasSuffix:@".png"]) { [request setValue:kPngRangeValue forHTTPHeaderField:@"Range"]; self.type = PngImage; }else if([self.picUrl hasSuffix:@".jpg"]){ [request setValue:kHTMLJpgRangeValue forHTTPHeaderField:@"Range"]; self.type = JpgImage; }else if([self.picUrl hasSuffix:@".gif"]){ [request setValue:kGifRangeValue forHTTPHeaderField:@"Range"]; self.type = GifImage; } request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; NSURLResponse *response = nil; NSError *error = NULL; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
</pre><pre code_snippet_id="1873833" snippet_file_name="blog_20160909_8_1212133" name="code" class="objc"><p style="margin-top: 0px; margin-bottom: 0px; font-size: 14px; line-height: normal; font-family: Menlo;"><pre name="code" class="objc">switch (_type) { case PngImage: { size = <span style="color:#ff6600;">pngImageSizeWithHeaderData(data)</span>; NSLog(@"png image size : %@", NSStringFromCGSize(size)); } break; case JpgImage: { size = <span style="color:#ff6600;">jpgImageSizeWithHeaderData(data)</span>; if (size.width == 0) { size = [self againDownLoad]; } NSLog(@"jpg image size : %@", NSStringFromCGSize(size)); } break; case GifImage: { size = <span style="color:#ff6600;">gifImageSizeWithHeaderData(data)</span>; NSLog(@"gif image size : %@", NSStringFromCGSize(size)); } break; default: break; }
CGSize pngImageSizeWithHeaderData(NSData *data) { int w1 = 0, w2 = 0, w3 = 0, w4 = 0; [data getBytes:&w1 range:NSMakeRange(0, 1)]; [data getBytes:&w2 range:NSMakeRange(1, 1)]; [data getBytes:&w3 range:NSMakeRange(2, 1)]; [data getBytes:&w4 range:NSMakeRange(3, 1)]; int w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4; int h1 = 0, h2 = 0, h3 = 0, h4 = 0; [data getBytes:&h1 range:NSMakeRange(4, 1)]; [data getBytes:&h2 range:NSMakeRange(5, 1)]; [data getBytes:&h3 range:NSMakeRange(6, 1)]; [data getBytes:&h4 range:NSMakeRange(7, 1)]; int h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4; return CGSizeMake(w, h); }
<span style="color:#cc66cc;">CGSize gifImageSizeWithHeaderData(NSData *data) { short w1 = 0, w2 = 0; [data getBytes:&w1 range:NSMakeRange(1, 1)]; [data getBytes:&w2 range:NSMakeRange(0, 1)]; short w = (w1 << 8) + w2; short h1 = 0, h2 = 0; [data getBytes:&h1 range:NSMakeRange(3, 1)]; [data getBytes:&h2 range:NSMakeRange(2, 1)]; short h = (h1 << 8) + h2; return CGSizeMake(w, h); }</span>
<span style="color:#cc66cc;">CGSize jpgImageSizeWithHeaderData(NSData *data) { #ifdef DEBUG // @"bytes=0-209" // assert([data length] == 210); #endif short word = 0x0; [data getBytes:&word range:NSMakeRange(0x15, 0x1)]; NSLog(@"short word == %d",word); if (word == 0xdb) { [data getBytes:&word range:NSMakeRange(0x5a, 0x1)]; if (word == 0xdb) { // 两个DQT字段 NSData *exactData = [data subdataWithRange:NSMakeRange(0xa3, 0x4)]; return jpgImageSizeWithExactData(exactData); } else { // 一个DQT字段 NSData *exactData = [data subdataWithRange:NSMakeRange(0x5e, 0x4)]; return jpgImageSizeWithExactData(exactData); } } else { NSUInteger len = [data length]; char * chars = (char *)[data bytes]; NSMutableString * hexString = [[NSMutableString alloc] init]; for(NSUInteger i = 0; i < len; i++ ) [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]]; NSLog(@"二进制元数据%@",data); NSLog(@"转换之后的二进制数据%@",hexString); //寻找字节FFC0 NSRange range = [hexString rangeOfString:@"ffc0"]; if (range.location == NSNotFound) {</span>
<span style="color:#cc66cc;"><span style="white-space:pre"> </span> //可以继续去下载更多字节的图片信息 return CGSizeZero; } NSString *str = [hexString substringWithRange:NSMakeRange(range.location + range.length + 6, 8)]; NSLog(@"取出之后的值 === %@",[hexString substringWithRange:NSMakeRange(range.location + range.length + 6, 8)]); //将字符串变成16进制 NSData *bt16 = stringFromHexString(str); NSLog(@"bt16 ===%@",bt16); return jpgImageSizeWithExactData(bt16); } }</span>
//2.PNG
<span style="color:#37bf36;">//由于图片的后缀不准确 所以用这个来判断类型 //- 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A </span><span style="color:#cc0000;">NSData *pngData = stringFromHexString(@"89504e470d0a1a0a");</span><span style="color:#37bf36;"> //3.GIF //- 文件头标识 (6 bytes) 47 49 46 38 39(37) 61 </span><span style="color:#cc0000;">NSData *gifData1 = stringFromHexString(@"474946383961"); NSData *gifData2 = stringFromHexString(@"474946383761");</span><span style="color:#37bf36;"> //4.JPEG/JPG //- 文件头标识 (2 bytes): FF, D8 (SOI) (JPEG 文件标识) </span><span style="color:#cc0000;">NSData *jpgData1 = stringFromHexString(@"ffd8");</span><span style="color:#37bf36;"> //- 文件结束标识 (2 bytes): FF, D9 (EOI) </span><span style="color:#cc0000;">NSData *jpgData2 = stringFromHexString(@"ffd9"); NSData *verifitionPngData = [data subdataWithRange:NSMakeRange(0x00, 0x8)]; NSData *verifitionGifData = [data subdataWithRange:NSMakeRange(0x00, 0x6)]; NSData *verifitionJpgData = [data subdataWithRange:NSMakeRange(0x00, 0x2)]; if ([verifitionPngData isEqualToData:pngData]) { self.type = PngImage; }else if([verifitionGifData isEqualToData:gifData1] || [verifitionGifData isEqualToData:gifData2]) { self.type = GifImage; }else if([verifitionJpgData isEqualToData:jpgData1] || [verifitionJpgData isEqualToData:jpgData2]) { self.type = JpgImage; }else{ self.type = JpgImage; } </span>补充:以上4种图片类型的特征码
1.BMP
-文件头标识 (2 bytes) 42 4D
2.PNG
- 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A
3.GIF
- 文件头标识 (6 bytes) 47 49 46 38 39(37) 61
4.JPEG/JPG
- 文件头标识 (2 bytes): FF, D8 (SOI) (JPEG 文件标识)
- 文件结束标识 (2 bytes): FF, D9 (EOI)
相关文章推荐
- 下载一首网络歌曲 该歌曲地址获取不到歌曲的大小,但可以正常播放
- 通过AFNetworking下载网络闪屏用的图片并存储到本地同时获取header头相关信息
- UITableView上下滚动卡顿(获取网络数据,下载图片之后)
- iOS下载图片之前获取网络图片尺寸的失败尝试
- 安卓中关于图片从网络获取,压缩,上传,下载,缩略图,缓存的一些处理总结(二)
- 下载一首网络歌曲 该歌曲地址获取不到歌曲的大小,但可以正常播放
- 获取不固定大小的网络图片,然后在UITableviewCell中显示
- 检测SDWebImage有没有缓存图片 IOS 获取网络图片大小
- iOS 通过网络请求获取图片的下载歌曲
- 获取网络图片并下载到本地相册
- IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合
- 获取网络图片的大小
- 获取网络图片的尺寸大小
- SDWebImage获取网络图片大小
- Android CacheImage之下载获取指定大小图片
- Android开发之异步获取并下载网络资源-下载图片和下载文本内容
- 如何更改图片像素大小及获取图片网络地址-上互助吧广告位必看!
- 封装的工具类(网络获取Json,图片,下载图片,下载Mp3,下载视频)
- 安卓中关于图片从网络获取,压缩,上传,下载,缩略图,缓存的一些处理总结(三)
- 安卓中关于图片从网络获取,压缩,上传,下载,缩略图,缓存的一些处理总结(一)