iOS下载图片之前获取网络图片尺寸的失败尝试

最近一直在找获取网络图片的size的方式,最后得出两个结论:

1 使用分线程下载下来,然后获得图片的size

2 使用网络请求图片的头文件,然后从头文件中找到图片大小的信息

第一种方法需要主线程分线程切换,因为在使用tableView来reloadData的时候,刷表老是出问题,先放着不管

然后我重点是想搞一下第二个方法:

在网上找到了一个博客:http://cxjwin.github.io/2013/11/05/preview_image_size/

大神写的很不错

主要思路就是先在网上找一个图片头文件的格式,然后对照着请求回来的data数据来进行查找,找到图片宽高的地方,解析出来

以png格式为例,先放一段代码:

        case PngImage:
        {
            NSString *URLString = @"http://pic12.nipic.com/20110118/1295091_171039317000_2.png";
            NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:URLString] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:2.0f];
            NSString *range=[NSString stringWithFormat:@"Bytes=16-23"];
            [request setValue:range forHTTPHeaderField:@"Range"];
            NSURLResponse *response=nil;
            NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];

            CGSize size = pngImageSizeWithHeaderData(data);
            NSLog(@"png image size : %@", NSStringFromCGSize(size));
        }

或者这样的

    NSString *URLString = @"http://pic12.nipic.com/20110118/1295091_171039317000_2.png";
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:URLString]];
    [request setValue:kPngRangeValue forHTTPHeaderField:@"Range"];
    [[NSURLConnection connectionWithRequest:request delegate:self] start];

请求方式不同,原理是一样的

然后就是对获取到的data进行解析

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);
}

在我的试验中,获取到的data数值为<00000400 000002ad>,只有八字节,前四位是width,后四位是height

这是他看过png的格式,所以在获取数据的时候只需要16-23位

data数据是以16进制数展示的,其实应该是 <00 00 04 00 00 00 02 ad>,每两个数代表8位,二进制中8位一个字节,这里换算一下,四个数可以表示一个字节

这个清楚了之后就可以照着网上的头文件解析来解析这些16进制数

下面放上网上的对jpeg头文件的部分解析

这些都还正常,放一段我获取到的data的分析记录

ff d8(soi) ff e0(appo)      00 10(数据长度) 4a 46    49 46 00(标示符) 01   02(版本号) 01(密度单位) 00 48(x密度) 00 48 (y密度)00(缩略图水平像素数目)00(缩略图垂直像素数目) ffed002c 50686f74

然后后面就奇葩起来了

然后我发现了我截取的data数据里各种appn标记码,然后这玩意儿是不知道有多长,有多少的,然后那个存着图片尺寸的标记码

ffc0被埋在data的汪洋大海里,我使用搜索找到了它,但是已经毛用没有了

瞬间,心都碎了

能获取png,gif格式的图片大小,因为png和gif格式的图片头文件固定,可以准确找到宽高所在字节,只需要极少流量就可以获得图片大小
但是jpeg的头文件很混乱,我真的想说它根本就不分header和body,绘图软件编辑一次保存一次就添加一个标记码,然后存放宽高的标记码就消失在数据流的某个地方了,因为不知道有多少个绘图软件编辑过,也不知道绘图软件标记码里面的内容格式,所以手动获取jpeg图片的宽高基本不可能了

我这么多天都白玩儿了

还是去捣鼓一下分线程吧,要不去搞一下webView,都比这个靠谱啊,,,

jpeg怎么可以这么坑

时间: 2024-12-23 11:53:28

iOS下载图片之前获取网络图片尺寸的失败尝试的相关文章

工具类 dp转px 获取图片实际尺寸 获取屏幕尺寸

dp转px public class Dp2pxUtils { public static int Dp2Px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } /** * 根据手机的分辨率从 px(像素) 的单位 转成为 dp */ public static int px

iOS 下载图片 -当后台返回的数据是文件流而不是图片url

NSString *urlStr = [NSString stringWithFormat:@"%@uploadFileRest/downFile",[AFAppDotNetAPIClient getUrl]]; NSURL *url = [NSURL URLWithString:urlStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @

GCD开启子线程下载图片

//开启子线程下载图片 //1.获取一个全局串行队列    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    __weak typeof(self) weakSelf = self; //2.把任务添加到队列中执行    dispatch_async(queue, ^{        NSURL *url = [NSURL URLWithString:_imgStr

检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];             //请求网络地址数据的同步方法             //因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题             SDWebImageManager *manager = [SDWebImageManager sharedManager];              [manag

IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

第一.复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象. 第二.如果一个对象想具备复制的功能,必须实现<NSCopying>协议和<NSMutableCopying>协议 NSObject自带的常用的对象有:NSNumber.NSString.NSArray.NSDictionary.NSMutableArray.NSMutableDictionay.NSMutableString,copy产生的对象时不可变的,mutableCopy产生的对象时可变的 第三.

iOS 通过网络请求获取图片的下载歌曲

1.导入代理<NSURLConnectionDataDelegate> 1 @interface ViewController ()<NSURLConnectionDataDelegate> 2 { 3 long long alllength; //下载总长度 4 long long currlenth; //当期下载长度 5 } 6 //存放下载的mp3 数据流 7 @property(nonatomic,strong)NSMutableData *msicDate; 8 //下

iOS获取网络图片大小

在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想通过最优的方法获得尺寸就略微有点困难,大体思路就是下面这种: 如果有使用SDWebImage,则首先检查是否缓存过该图片,如果没有,先通过文件头获取图片大小(针对格式为png.gif.jpg文件获取其尺寸大小),如果获取失败,则下载完整的图片data,然后计算大小,如果有使用SDWebImage,则

【iOS开发之旅】AFNetworking与SDWebImage下载图片

AFNetworking与SDWebImage下载图片 // // ViewController.m // AFNetworkingDemo // // Created by ChenQianPing on 16/1/31. // Copyright © 2016年 chenqp. All rights reserved. // #import "ViewController.h" #import "AFNetworking.h" #import "UII

获取网络图片的大小 改变 图片色值 灰度什么的方法集合-b

直接上代码了 头文件   // 图片处理 0 半灰色  1 灰度   2 深棕色    3 反色 +(UIImage*)imageWithImage:(UIImage*)image grayLevelType:(UIImageGrayLevelType)type; //色值 变暗多少 0.0 - 1.0 +(UIImage*)imageWithImage:(UIImage*)image darkValue:(float)darkValue; /** 获取网络图片的Size, 先通过文件头来获取图