美文网首页
iOS加载大图

iOS加载大图

作者: 逃之不桃 | 来源:发表于2018-06-25 17:45 被阅读0次

假如你有一张超级大的图片几十m的那种,你会怎么做呢?

直接使用UIImageview吗?那样内存会瞬间爆掉的。苹果提供了一个类来专门干这个事,CATiledLayer。

思想很简单,就是把大图切割成很多个小图,然后在CATiledLayer的drawRect方法里决定哪一部分该加载哪一张小图,因为是实时绘制的,即绘制完一张图片就释放掉一张图片,所以内存方面基本没有增长,当你放大或者缩小时,就会触发CATiledLayer的drawRect方法。

关键点:

首先,你需要有一个自定义的CATiledLayer

图片切割,取得指定行列的小图:

func prepareForSource(atCol col: Int, row: Int) -> UIImage? {

var width = tileSize

var height = tileSize

//最后一列

if col == totalCol-1 {

width = lastColWidth

}

if row == totalRow-1 {

height = lastRowHeight

}

if width == 0 || height == 0 {

return nil

}

let tileImage: CGImage = cgSourceImage!.cropping(to: CGRect(x: CGFloat(

CGFloat(col) * tileSize), y: CGFloat(CGFloat(row) * tileSize), width: width, height: tileSize))!

return UIImage(cgImage: tileImage)

}

drawRect计算哪张图片绘制到那个rect

override func draw(_ rect: CGRect) {

let ctx: CGContext? = UIGraphicsGetCurrentContext()

let bounds: CGRect = rect

//draw tile

let blockSize: CGSize = self.blockSize

let firstCol = Int(bounds.origin.x / blockSize.width)

let lastCol = Int((bounds.origin.x + bounds.size.width) / blockSize.width - 1)

let firstRow = Int(bounds.origin.y / blockSize.height)

let lastRow = Int((bounds.origin.y + bounds.size.height) / blockSize.height - 1)

//防止过度放大

if (firstRow >= lastRow || firstCol >= lastCol) && (firstCol != totalCol - 1 && lastCol != totalCol - 1 && firstRow != totalRow - 1 && lastRow != totalRow - 1) {

return

}

var i = 0

for row in firstRow...lastRow {

UIGraphicsPushContext(ctx!)

for col in firstCol...lastCol {

//load tile image

let tileImage: UIImage? = prepareForSource(atCol: col, row: row)

if tileImage == nil {

continue

}

let drawRect = CGRect(x: CGFloat(col * Int(blockSize.width)), y: CGFloat(row * Int(blockSize.height)), width: CGFloat(blockSize.width), height: CGFloat(blockSize.height))

tileImage?.draw(in: drawRect)

I+=1

}

UIGraphicsPopContext()

}

当然要实现缩放,你得把视图放在一个scrollview上面,然后实现对应的方法就好了。

demo地址:https://github.com/taozaizai/TYTiedRender

相关文章

  • iOS加载大图

    假如你有一张超级大的图片几十m的那种,你会怎么做呢? 直接使用UIImageview吗?那样内存会瞬间爆掉的。苹果...

  • iOS 加载大图优化思路

      场景:假如有一张非常大的图片,可能有500MB,也可能有1个G甚至更大。需要显示在我们的iOS设备,该怎样加载...

  • 加载大图

    利用 BitmapRegionDecoder 进行bitmap的部分加载 相关方法BitmapRegionDeco...

  • 大图加载

    发大幅度

  • iOS-渐进渲染大图

    渐进渲染大图对加载大图特别重要,地图都是局部加载,放大移动时候一部分一部分的渐进的加载,一般在对大图进行网络请求时...

  • Glide大图加载 长图加载

    Glide概述 有些朋友觉得Glide 4相对于Glide 3改动非常大,其实不然。之所以大家会有这种错觉,是因为...

  • iOS图像加载原理

    图片加载 在iOS中,图片显示的过程大致如下: 从磁盘读取图片并加载到内存。(data buffer) CPU对图...

  • YYAnimatedImageView iOS14部分图片不展示

    iOS14使用YYAnimatedImageView加载动图时会导致不显示相关图片。YYAnimatedImage...

  • iOS 显示动态图、GIF图方法总结

    总结了iOS中显示动态图的几种方法。点击下载 Demo 一、WebView加载 可以通过WebView加载本地Gi...

  • iOS加载超清大图内存暴涨问题解决

    加载超清大图是会引起内存爆表的问题,最近一直困扰着我。SDWebImage在加载大图时做的不是很好,加载大图内存爆...

网友评论

      本文标题:iOS加载大图

      本文链接:https://www.haomeiwen.com/subject/cyayyftx.html