iOS获取图片的Base64String,兼容Android,java,web,jpg(jpeg),png
呃呃呃……需求的来源又是同学,对!又是!
废话不哆嗦,怎么把一张图在iOS上转一个Base64String出来,稍微了解的,或者随便搜一下,都能搞定一大堆,但是!!!!
自己(iOS)转自己用,完全没问题,但是当你需要和安卓、web端一起用的时候,事情就爆炸了,你可能会发现自己转出的Base64String和别人的不一样,你以为人家错了,可是人家转出来的都一样!!!!!
事情完全不怪你,主要是因为UIImage类,这个类会悄悄地对你读进来的图片进行加工,具体干了啥,我也不知道,但是我知道这步加工会导致你出错,所以类似下面的方法都不可以。
1 UIImage * img = [UIImage imageNamed:@"test.jpg"]; 2 NSData * data = UIImageJPEGRepresentation(img, 1.0f); 3 NSString * str = [data base64Encoding]; 4 //base64Encoding首先是这个方法可能即将被苹果废掉,其次,转出的字符串其他平台搞不定 5 NSString * str2 = [data base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength]; 6 //这一次,方法对了,注意Options的参数NSDataBase64Encoding76CharacterLineLength,需要选这一个,不幸的的是,还是没法用,因为data的来源是UIImage。
那么到底该怎么办?,答案很简单,不走UIImage,所以下面这一句可以搞定!
NSString *Str = [[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test.jpg" ofType:nil]] base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
拆开是这样的:
1 NSString *path = [[NSBundle mainBundle]pathForResource:@"test" ofType:@"jpg"];//图片路径 2 NSData * data = [NSData dataWithContentsOfFile:path];//所以这里你可以换成网络路径,如下 3 NSURL * url = [NSURL URLWithString:@"your url string"];//url 4 NSData * data2 = [NSData dataWithContentsOfURL:url]; 5 NSString * str = [data base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];//str 华丽丽的诞生了
综上所述:data的来源很重要,所以尽可能用路径,但是你的需求非得从UIImage中获取data怎么办?
也有办法,先写入文件,再从文件读取data,这可不是脱裤子放屁--找麻烦,简单解释下:
Q:为什么UIImage获取的data转出的Base64String不行?
A:因为UIImage改变了图片的data。
Q:那么写回文件会还原数据么?
A:不会!
Q:那写回去有个P用?!!!
A:道理很简单,虽然写回去的data和原来的data不同了,但是这时候它是一张标准的图了,而不是一个UIImage对象,再从这里获取data,又是标准的图片的data。所以就可以了。
好了 ,上类!!!下载地址:https://files.cnblogs.com/files/kongkaikai/GetImgBase64String.zip
使用方法简直是太简单了!!!!,不解释!!!
1 NSString * str = [GetImgBase64String getImgBase64StringWithImgFilePath:[[NSBundle mainBundle]pathForResource:@"a" ofType:@"png"]]; 2 NSString * str2 = [GetImgBase64String getImgBase64StringWithImg:[UIImage imageNamed:@"test.jpg"]]; 3 NSString * str3 = [GetImgBase64String getImgBase64StringWithImg:[UIImage imageNamed:@"test.jpg"] Ratio:0.7];
4 //你要是不引入.h,我保证不打死你!!!!!
5 //至于为什么我不写一个知己ImgName,然后把[[NSBundle mainBundle]pathForResource:@"a" ofType:@"png"]自己搞定一遍是怕你随便找个名字就乱用!!!