经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS根据图片url获取尺寸
来源:cnblogs  作者:菁欣  时间:2018/10/18 8:55:15  对本文有异议

可以在UIImage的分类中加入下面的代码,并且引入系统的ImageIO.framework

  1. /**
  2. 根据图片的url获取尺寸
  3. @param URL url
  4. @return CGSize
  5. */
  6. + (CGSize)getImageSizeWithURL:(id)URL;
  7. /**
  8. * 根据图片url获取图片尺寸
  9. */
  10. + (CGSize)getImageSizeWithURL:(id)URL{
  11. NSURL * url = nil;
  12. if ([URL isKindOfClass:[NSURL class]]) {
  13. url = URL;
  14. }
  15. if ([URL isKindOfClass:[NSString class]]) {
  16. url = [NSURL URLWithString:URL];
  17. }
  18. if (!URL) {
  19. return CGSizeZero;
  20. }
  21. CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
  22. CGFloat width = 0, height = 0;
  23. if (imageSourceRef) {
  24. CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
  25. if (imageProperties != NULL) {
  26. CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
  27. if (widthNumberRef != NULL) {
  28. CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
  29. }
  30. CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
  31. if (heightNumberRef != NULL) {
  32. CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
  33. }
  34. CFRelease(imageProperties);
  35. }
  36. CFRelease(imageSourceRef);
  37. }
  38. return CGSizeMake(width, height);
  39. }

实践证明,网上的另外一种方法是不可行存在问题的,贴上所示的图片url:http://xs3.op.xywy.com/club.xywy.com/doc/20181017/0fd2a51f9435a4.jpg

  1. // 根据图片url获取图片尺寸
  2. -(CGSize)getImageSizeWithURL:(id)imageURL
  3. {
  4. NSURL* URL = nil;
  5. if([imageURL isKindOfClass:[NSURL class]]){
  6. URL = imageURL;
  7. }
  8. if([imageURL isKindOfClass:[NSString class]]){
  9. URL = [NSURL URLWithString:imageURL];
  10. }
  11. if(URL == nil)
  12. return CGSizeZero; // url不正确返回CGSizeZero
  13. NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
  14. NSString* pathExtendsion = [URL.pathExtension lowercaseString];
  15. CGSize size = CGSizeZero;
  16. if([pathExtendsion isEqualToString:@"png"]){
  17. size = [self getPNGImageSizeWithRequest:request];
  18. }
  19. else if([pathExtendsion isEqual:@"gif"])
  20. {
  21. size = [self getGIFImageSizeWithRequest:request];
  22. }
  23. else{
  24. size = [self getJPGImageSizeWithRequest:request];
  25. }
  26. if(CGSizeEqualToSize(CGSizeZero, size)) // 如果获取文件头信息失败,发送异步请求请求原图
  27. {
  28. NSData* data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:nil error:nil];
  29. UIImage* image = [UIImage imageWithData:data];
  30. if(image)
  31. {
  32. size = image.size;
  33. }
  34. }
  35. return size;
  36. }
  37. // 获取PNG图片的大小
  38. -(CGSize)getPNGImageSizeWithRequest:(NSMutableURLRequest*)request
  39. {
  40. [request setValue:@"bytes=16-23" forHTTPHeaderField:@"Range"];
  41. NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
  42. if(data.length == 8)
  43. {
  44. int w1 = 0, w2 = 0, w3 = 0, w4 = 0;
  45. [data getBytes:&w1 range:NSMakeRange(0, 1)];
  46. [data getBytes:&w2 range:NSMakeRange(1, 1)];
  47. [data getBytes:&w3 range:NSMakeRange(2, 1)];
  48. [data getBytes:&w4 range:NSMakeRange(3, 1)];
  49. int w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4;
  50. int h1 = 0, h2 = 0, h3 = 0, h4 = 0;
  51. [data getBytes:&h1 range:NSMakeRange(4, 1)];
  52. [data getBytes:&h2 range:NSMakeRange(5, 1)];
  53. [data getBytes:&h3 range:NSMakeRange(6, 1)];
  54. [data getBytes:&h4 range:NSMakeRange(7, 1)];
  55. int h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4;
  56. return CGSizeMake(w, h);
  57. }
  58. return CGSizeZero;
  59. }
  60. // 获取gif图片的大小
  61. -(CGSize)getGIFImageSizeWithRequest:(NSMutableURLRequest*)request
  62. {
  63. [request setValue:@"bytes=6-9" forHTTPHeaderField:@"Range"];
  64. NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
  65. if(data.length == 4)
  66. {
  67. short w1 = 0, w2 = 0;
  68. [data getBytes:&w1 range:NSMakeRange(0, 1)];
  69. [data getBytes:&w2 range:NSMakeRange(1, 1)];
  70. short w = w1 + (w2 << 8);
  71. short h1 = 0, h2 = 0;
  72. [data getBytes:&h1 range:NSMakeRange(2, 1)];
  73. [data getBytes:&h2 range:NSMakeRange(3, 1)];
  74. short h = h1 + (h2 << 8);
  75. return CGSizeMake(w, h);
  76. }
  77. return CGSizeZero;
  78. }
  79. // 获取jpg图片的大小
  80. -(CGSize)getJPGImageSizeWithRequest:(NSMutableURLRequest*)request
  81. {
  82. [request setValue:@"bytes=0-209" forHTTPHeaderField:@"Range"];
  83. NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
  84. if ([data length] <= 0x58) {
  85. return CGSizeZero;
  86. }
  87. if ([data length] < 210) {// 肯定只有一个DQT字段
  88. short w1 = 0, w2 = 0;
  89. [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
  90. [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
  91. short w = (w1 << 8) + w2;
  92. short h1 = 0, h2 = 0;
  93. [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
  94. [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
  95. short h = (h1 << 8) + h2;
  96. return CGSizeMake(w, h);
  97. } else {
  98. short word = 0x0;
  99. [data getBytes:&word range:NSMakeRange(0x15, 0x1)];
  100. if (word == 0xdb) {
  101. [data getBytes:&word range:NSMakeRange(0x5a, 0x1)];
  102. if (word == 0xdb) {// 两个DQT字段
  103. short w1 = 0, w2 = 0;
  104. [data getBytes:&w1 range:NSMakeRange(0xa5, 0x1)];
  105. [data getBytes:&w2 range:NSMakeRange(0xa6, 0x1)];
  106. short w = (w1 << 8) + w2;
  107. short h1 = 0, h2 = 0;
  108. [data getBytes:&h1 range:NSMakeRange(0xa3, 0x1)];
  109. [data getBytes:&h2 range:NSMakeRange(0xa4, 0x1)];
  110. short h = (h1 << 8) + h2;
  111. return CGSizeMake(w, h);
  112. } else {// 一个DQT字段
  113. short w1 = 0, w2 = 0;
  114. [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
  115. [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
  116. short w = (w1 << 8) + w2;
  117. short h1 = 0, h2 = 0;
  118. [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
  119. [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
  120. short h = (h1 << 8) + h2;
  121. return CGSizeMake(w, h);
  122. }
  123. } else {
  124. return CGSizeZero;
  125. }
  126. }
  127. }

源自:https://www.jianshu.com/p/9984c37f3f54 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号