iOS根据图片url获取尺寸
生活随笔
收集整理的這篇文章主要介紹了
iOS根据图片url获取尺寸
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可以在UIImage的分類中加入下面的代碼,并且引入系統的ImageIO.framework
/**根據圖片的url獲取尺寸@param URL url@return CGSize*/ + (CGSize)getImageSizeWithURL:(id)URL;/*** 根據圖片url獲取圖片尺寸*/ + (CGSize)getImageSizeWithURL:(id)URL{NSURL * url = nil;if ([URL isKindOfClass:[NSURL class]]) {url = URL;}if ([URL isKindOfClass:[NSString class]]) {url = [NSURL URLWithString:URL];}if (!URL) {return CGSizeZero;}CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);CGFloat width = 0, height = 0;if (imageSourceRef) {CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);if (imageProperties != NULL) {CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);// if (widthNumberRef != NULL) { // CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width); // } // CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight); // if (heightNumberRef != NULL) { // CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height); // }//判斷設備是否為64位 #if defined(__LP64__) && __LP64__if (widthNumberRef != NULL) {CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);}CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);if (heightNumberRef != NULL) {CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);} #elseif (widthNumberRef != NULL) {CFNumberGetValue(widthNumberRef, kCFNumberFloat32Type, &width);}CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);if (heightNumberRef != NULL) {CFNumberGetValue(heightNumberRef, kCFNumberFloat32Type, &height);} #endifCFRelease(imageProperties);}CFRelease(imageSourceRef);}return CGSizeMake(width, height); }?
實踐證明,網上的另外一種方法是不可行存在問題的,貼上所示的圖片url:http://xs3.op.xywy.com/club.xywy.com/doc/20181017/0fd2a51f9435a4.jpg
// 根據圖片url獲取圖片尺寸 -(CGSize)getImageSizeWithURL:(id)imageURL {NSURL* URL = nil;if([imageURL isKindOfClass:[NSURL class]]){URL = imageURL;}if([imageURL isKindOfClass:[NSString class]]){URL = [NSURL URLWithString:imageURL];}if(URL == nil)return CGSizeZero; // url不正確返回CGSizeZero NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];NSString* pathExtendsion = [URL.pathExtension lowercaseString];CGSize size = CGSizeZero;if([pathExtendsion isEqualToString:@"png"]){size = [self getPNGImageSizeWithRequest:request];}else if([pathExtendsion isEqual:@"gif"]){size = [self getGIFImageSizeWithRequest:request];}else{size = [self getJPGImageSizeWithRequest:request];}if(CGSizeEqualToSize(CGSizeZero, size)) // 如果獲取文件頭信息失敗,發送異步請求請求原圖 {NSData* data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:nil error:nil];UIImage* image = [UIImage imageWithData:data];if(image){size = image.size;}}return size; } // 獲取PNG圖片的大小 -(CGSize)getPNGImageSizeWithRequest:(NSMutableURLRequest*)request {[request setValue:@"bytes=16-23" forHTTPHeaderField:@"Range"];NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];if(data.length == 8){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);}return CGSizeZero; } // 獲取gif圖片的大小 -(CGSize)getGIFImageSizeWithRequest:(NSMutableURLRequest*)request {[request setValue:@"bytes=6-9" forHTTPHeaderField:@"Range"];NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];if(data.length == 4){short w1 = 0, w2 = 0;[data getBytes:&w1 range:NSMakeRange(0, 1)];[data getBytes:&w2 range:NSMakeRange(1, 1)];short w = w1 + (w2 << 8);short h1 = 0, h2 = 0;[data getBytes:&h1 range:NSMakeRange(2, 1)];[data getBytes:&h2 range:NSMakeRange(3, 1)];short h = h1 + (h2 << 8);return CGSizeMake(w, h);}return CGSizeZero; } // 獲取jpg圖片的大小 -(CGSize)getJPGImageSizeWithRequest:(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;}} }源自:https://www.jianshu.com/p/9984c37f3f54?
轉載于:https://www.cnblogs.com/jingxin1992/p/9805822.html
總結
以上是生活随笔為你收集整理的iOS根据图片url获取尺寸的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于IPv4设置一些常见问题的解答
- 下一篇: vue 本地环境API代理设置和解决跨域