iOS之旅--显示网络图片和base64二进制图片

时间:2022-11-12 21:17:30

iOS之旅–显示网络图片和base64二进制图片

显示网络图片

在这里我使用的是SDWebImage源码,

  1. 首先我们需要下载SDWebImage的源码,地址为:https://github.com/rs/SDWebImage
  2. 把下载下来的代码中得 SDWebImage文件夹导入(copy)工程中,
  3. 需要用到网络下载图片的地方,引入头文件 #import "UIImageView+WebCache.h"
  4. 然后根据自己的需求调用函数即可,
 -(void)sd_setImageWithURL:(NSURL *)url
//可以传入一个默认的图片,当网络图片还未下载下载的时候显示这个图片
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
//多一个当下载完成的时候的函数,可以在这里添加自己想要做的处理
-(void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock

另外有的地方有 options这个参数,可以根据自己的需求设置,如下所示:

// //options 选择方式
//
// [self.image1 sd_setImageWithURL:imagePath1 placeholderImage:[UIImage imageNamed:@"default"] options:SDWebImageRetryFailed];
// /*
// //失败后重试
// SDWebImageRetryFailed = 1 << 0,
//
// //UI交互期间开始下载,导致延迟下载比如UIScrollView减速。
// SDWebImageLowPriority = 1 << 1,
//
// //只进行内存缓存
// SDWebImageCacheMemoryOnly = 1 << 2,
//
// //这个标志可以渐进式下载,显示的图像是逐步在下载
// SDWebImageProgressiveDownload = 1 << 3,
//
// //刷新缓存
// SDWebImageRefreshCached = 1 << 4,
//
// //后台下载
// SDWebImageContinueInBackground = 1 << 5,
//
// //NSMutableURLRequest.HTTPShouldHandleCookies = YES;
//
// SDWebImageHandleCookies = 1 << 6,
//
// //允许使用无效的SSL证书
// //SDWebImageAllowInvalidSSLCertificates = 1 << 7,
//
// //优先下载
// SDWebImageHighPriority = 1 << 8,
//
// //延迟占位符
// SDWebImageDelayPlaceholder = 1 << 9,
//
// //改变动画形象
// SDWebImageTransformAnimatedImage = 1 << 10,
// */

显示二进制图片

首先说下这个二进制图片我也是刚接触,写的错误的希望给我留言,谢谢。
搞这个也是让我很无语。上个例子

//服务器给返回的是这个字符串
//data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABupgeRAAAAhElEQVRYhe3Y0QmAIBhF4YwGaZRGaNRGaJRGaYEyTj/RfTjnVYQPBRXbuh9DXuPfgOtkkWSRZJFkkUJZU3H+tsx3Q5VrLXS1ZJFkkWSRZJFkkWSRZJFkkUJZLfPH5vktX3mtv54buomySLJIskihrNBTvvWHP0V37oDQTZRFkkWSRQplnQDfEjVVBe3tAAAAAElFTkSuQmCC

上面的字符串复制到浏览器是可以显示出来一个图片的,这里说一下,字符串前面的data:image/png;base64是这个图片的格式,
- web上面 解析好像是需要这部分的,但是拿到我们的iOS平台上,是不需要这部分的,有这部分反而解析不出来图片。
- 所以这里可以说这部分属于格式部分,so我们显示的时候不要这部分。
下面是我显示这个二进制图片的代码:可以供大家参考

//参数在这里 + (void) setImageView:(UIImageView *)imageView WithString:(NSString *)avatar
//二进制显示
/*服务器返回:例如
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABupgeRAAAAhElEQVRYhe3Y0QmAIBhF4YwGaZRGaNRGaJRGaYEyTj/RfTjnVYQPBRXbuh9DXuPfgOtkkWSRZJFkkUJZU3H+tsx3Q5VrLXS1ZJFkkWSRZJFkkWSRZJFkkUJZLfPH5vktX3mtv54buomySLJIskihrNBTvvWHP0V37oDQTZRFkkWSRQplnQDfEjVVBe3tAAAAAElFTkSuQmCC
*/

NSArray *imageArray = [avatar componentsSeparatedByString:@","];
NSData *imageData = [[NSData alloc] initWithBase64EncodedString:imageArray[1] options:NSDataBase64DecodingIgnoreUnknownCharacters];
imageView.image = [UIImage imageWithData:imageData];

这里面我是用componentsSeparatedByString:函数根据逗号把字符串拆分了,当然也有别的办法,服务器返回的图片前面那部分基本都是固定的,可以直接把字符串替换了。

终结

我这里因为是用到两种类型的图片,所以直接封了一个函数,可以参考,注释自己感觉已经写的够明白了。
只需要传入 要设置图片的那个UIViewImage和服务器给你的字符串(我这边是有两种情况的字符串)

:::简单说下啊,SDWebView这个框架是具有图片缓存功能的,个人感觉非常好用。

//文件上面需要导入头文件
#import "UIImageView+WebCache.h"

………………
代码省略
………………

//根据图片下载地址或者二进制字符串 设置图片
+ (void) setImageView:(UIImageView *)imageView WithString:(NSString *)avatar
{
if ([[avatar substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"/"] ) {
//地址下载
//如 /uploads/avatars/cache/50__IY_-HE-5l8deD-QuMp55Vn9zN74e8rg.png
NSString *avatarUrl = [NSString stringWithFormat:@"%@%@", URL_BASE, [UserSingleton sharedManager].user.avatar];

[imageView sd_setImageWithURL:[[NSURL alloc] initWithString:avatarUrl ] placeholderImage:[UIImage imageNamed:@"pic.png"] options:SDWebImageRetryFailed completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//下载完成处理
}];
} else {
//二进制显示
/*服务器返回:例如
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABupgeRAAAAhElEQVRYhe3Y0QmAIBhF4YwGaZRGaNRGaJRGaYEyTj/RfTjnVYQPBRXbuh9DXuPfgOtkkWSRZJFkkUJZU3H+tsx3Q5VrLXS1ZJFkkWSRZJFkkWSRZJFkkUJZLfPH5vktX3mtv54buomySLJIskihrNBTvvWHP0V37oDQTZRFkkWSRQplnQDfEjVVBe3tAAAAAElFTkSuQmCC
*/

NSArray *imageArray = [avatar componentsSeparatedByString:@","];
NSData *imageData = [[NSData alloc] initWithBase64EncodedString:imageArray[1] options:NSDataBase64DecodingIgnoreUnknownCharacters];
imageView.image = [UIImage imageWithData:imageData];
}
#pragma mark 把图片转换为二进制,一般情况下,给服务器发送图片可能要用到这里,
// NSData *ia = UIImagePNGRepresentation([UIImage imageNamed:@"pic.png"]);
}