文档章节

iOS疯狂详解之imageIO完成渐进加载图片

hanbing94
 hanbing94
发布于 2015/09/29 16:06
字数 673
阅读 130
收藏 1

一、常见渐进加载图片模式

目前我们看到的渐进加载主要有以下三种实现方式:

1) 依次从web上加载不同尺寸的图片,从小到大。最开始先拉取一个小缩略图做拉伸显示,然后拉取中等规格的图,拉取完毕直接覆盖显示,最后拉取原图,拉取完成后显示原图。

2)直接从web上拉取最大的图片,每接受一点儿数据就显示一点儿图片,这样就会实现从上到下一点点刷新出来的效果。

3)结合第1种和第2种,先拉取一个缩略图做拉伸显示,然后采用第二种方法直接拉取原图,这样即可以实现渐进加载,也可以节省几次中间的网络请求。

今天我们要讨论的是CGImageSource实现从web端渐进加载图片,要达到这个目的我们需要创建一个URLConnnection,然后实现代理,每次接收到数据时更新图片即可。下面主要的实现源码:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
//  SvIncrementallyImage.m
//  SvIncrementallyImage
//
//  Created by  maple on 6/27/13.
//  Copyright (c) 2013 maple. All rights reserved.
//
 
# import "SvIncrementallyImage.h"
# import <imageio imageio.h= "" >
# import <corefoundation corefoundation.h= "" >
 
@interface SvIncrementallyImage () {
     NSURLRequest    *_request;
     NSURLConnection *_conn;
     
     CGImageSourceRef _incrementallyImgSource;
     
     NSMutableData   *_recieveData;
     long long       _expectedLeght;
     bool            _isLoadFinished;
}
 
@property (nonatomic, retain) UIImage *image;
@property (nonatomic, retain) UIImage *thumbImage;
 
 
@implementation SvIncrementallyImage
 
@synthesize imageURL = _imageURL;
@synthesize image    = _image;
@synthesize thumbImage = _thumbImage;
 
- (id)initWithURL:(NSURL *)imageURL
{
     self = [ super init];
     if (self) {
         _imageURL = [imageURL retain];
         
         _request = [[NSURLRequest alloc] initWithURL:_imageURL];
         _conn    = [[NSURLConnection alloc] initWithRequest:_request delegate:self];
         
         _incrementallyImgSource = CGImageSourceCreateIncremental(NULL);
         
         _recieveData = [[NSMutableData alloc] init];
         _isLoadFinished = false ;
     }
     
     return self;
}
 
#pragma mark -
#pragma mark NSURLConnectionDataDelegate
 
- ( void )connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
     _expectedLeght = response.expectedContentLength;
     NSLog(@ "expected Length: %lld" , _expectedLeght);
     //获得大文件的长度

    NSString *mimeType = response.MIMEType;

 NSLog(@"MIME TYPE %@", mimeType);

    //获得文件的类型(mimetype=image/jpeg ); 

    NSArray *arr = [mimeType componentsSeparatedByString:@"/"];

//判断有没有image  是不是image类型

     if (arr.count < 1 || ![[arr objectAtIndex: 0 ] isEqual:@ "image" ]) {
         NSLog(@ "not a image url" );
         [connection cancel];
         [_conn release]; _conn = nil;
     }
}
 
- ( void )connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
     NSLog(@ "Connection %@ error, error info: %@" , connection, error);
}
 
- ( void )connectionDidFinishLoading:(NSURLConnection *)connection
{
     NSLog(@ "Connection Loading Finished!!!" );
     
     // if download image data not complete, create final image
     if (!_isLoadFinished) {
         CGImageSourceUpdateData(_incrementallyImgSource, (CFDataRef)_recieveData, _isLoadFinished);
         CGImageRef imageRef = CGImageSourceCreateImageAtIndex(_incrementallyImgSource, 0 , NULL);
         self.image = [UIImage imageWithCGImage:imageRef];
         CGImageRelease(imageRef);
     }
}
 
- ( void )connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
     [_recieveData appendData:data];
     
     _isLoadFinished = false ;
     if (_expectedLeght == _recieveData.length) {
         _isLoadFinished = true ;
     }
     //imageIO框架中方法的运用
     CGImageSourceUpdateData(_incrementallyImgSource, (CFDataRef)_recieveData, _isLoadFinished);
     CGImageRef imageRef = CGImageSourceCreateImageAtIndex(_incrementallyImgSource, 0 , NULL);
     self.image = [UIImage imageWithCGImage:imageRef];
     CGImageRelease(imageRef);
}
 
@end </corefoundation></imageio>


© 著作权归作者所有

hanbing94
粉丝 2
博文 68
码字总数 38602
作品 0
朝阳
私信 提问
浅谈移动端图片压缩(iOS & Android)

在 App 中,如果分享、发布、上传功能涉及到图片,必不可少会对图片进行一定程度的压缩。笔者最近在公司项目中恰好重构了双端(iOS&Android)的图片压缩模块。本文会非常基础的讲解一些图片压...

Nemocdz
01/20
0
0
iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普

iOS 终于支持了 PWA,一起来认识一下这个强化版「小程序」 | 科普 发布于 2018-04-13 文章被以下专栏收录

少数派
2018/07/06
0
0
iOS中UIWebView的使用详解

iOS中UIWebView的使用详解 一、初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (voi...

珲少
2015/06/23
44.1K
1
iOS 处理图片的一些小 Tip

https://blog.ibireme.com/2015/11/02/iosimagetips/ 如何把 GIF 动图保存到相册? iOS 的相册是支持保存 GIF 和 APNG 动图的,只是不能直接播放。用 [ALAssetsLibrary writeImageDataToSav...

壹峰
2018/10/15
18
0
全面解析基于 iOS 的 PWA 程序

在iOS11.3版本中,苹果公司已悄悄地增加了基于“渐进式Web应用程序”(Progressive Web Apps,PWA)概念的新技术基础合集。是时候来看看他们是如何工作的,他们的能力和挑战是什么,以及如果...

oschina
2018/04/17
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
7
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
昨天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
昨天
2.7K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部