ImageIO In Swift

ImageIO In Swift

//可读取的文件格式 
let sourceSupportTypes =  CGImageSourceCopyTypeIdentifiers()
//可写入的文件格式
let destinationSupportTypes = CGImageDestinationCopyTypeIdentifiers()

CGImageSource

图片上下文,解析出图片数据(图片宽高,颜色空间,图片大小...)
通过CGImageSourceCreate创建

guard let cgImageSource = CGImageSourceCreateWithURL(url, options) else {
    print("Create Image Source failure.")
    return        
}

CGImageSourceGetCount 可以获取图片上下文中解析出来的图片数量
通过CGImageSourceCreateImageAtIndex 可以获取已解码的图片数据CGImage

CGImageSourceCreateThumbnailAtIndex可以从上下文中读取到缩略图

options中的kCGImageSourceCreateThumbnailFromImageIfAbsent如果不指定的话可能会读取不到缩略图,指定为true,表示是否自动创建缩略图。当上下文中没有包含有缩略图数据时,为true就会根据原始图生成缩略图。
kCGImageSourceThumbnailMaxPixelSize:指定了缩略图的最大宽高都不能超过这个值

var size = cgImage.height / 2
let thumbSizeNumber = CFNumberCreate(CFAllocatorGetDefault().takeUnretainedValue(), CFNumberType.intType, &size)
let thumb_options = CFDictionaryCreateMutable(CFAllocatorGetDefault().takeUnretainedValue(), 0, nil, nil)
CFDictionaryAddValue(thumb_options, Unmanaged.passUnretained(kCGImageSourceThumbnailMaxPixelSize).toOpaque(), Unmanaged.passUnretained(thumbSizeNumber!).toOpaque())
CFDictionaryAddValue(thumb_options, Unmanaged.passUnretained(kCGImageSourceCreateThumbnailFromImageIfAbsent).toOpaque(), Unmanaged.passUnretained(kCFBooleanTrue).toOpaque())

guard let cgThumbImage = CGImageSourceCreateThumbnailAtIndex(cgImageSource, 0, thumb_options) else {
    print("Create Thumb CGImage failure.")
    return
}

如果遇到大的图片,比如在读取网络图片时可以使用CGImageSourceCreateIncremental来渐进加载图片,步骤如下:
1.创建一个CFMutableData
2.创建一个Incremental Image Source
3.向CFMutableData中添加已经接受到的Data数据
4.调用CGImageSourceUpdateData来将数据更新到Incremental Image Source
5.读取图片状态CGImageSourceGetStatus,判断状态是否为status complete
6.通过CGImageSourceCreateImageAtIndex或CGImageSourceCreateThumbnailAtIndex读取图片数据

 guard let incrementData = CFDataCreateMutable(CFAllocatorGetDefault().takeUnretainedValue(), 0) else {
            fatalError()
        }
        
let thumb_options = CFDictionaryCreateMutable(CFAllocatorGetDefault().takeUnretainedValue(), 0, nil, nil)
CFDictionaryAddValue(thumb_options, Unmanaged.passUnretained(kCGImageSourceCreateThumbnailFromImageIfAbsent).toOpaque(), Unmanaged.passUnretained(kCFBooleanTrue).toOpaque())
CFDictionaryAddValue(thumb_options, Unmanaged.passUnretained(kCGImageSourceCreateThumbnailWithTransform).toOpaque(), Unmanaged.passUnretained(kCFBooleanTrue).toOpaque())
DispatchQueue.global().async {
let incrementSource = CGImageSourceCreateIncremental(nil)
let byteCount = Int(percent * Float(self.fullData.count))
print(byteCount, self.fullData.count)
let bytes = UnsafeMutablePointer<UInt8>.allocate(capacity: byteCount)
self.fullData.copyBytes(to: bytes, count: byteCount)
CFDataAppendBytes(incrementData, bytes, byteCount)
CGImageSourceUpdateData(incrementSource, incrementData, true)
let status = CGImageSourceGetStatus(incrementSource)
switch status {
    case .statusComplete:
        if let cgImage = CGImageSourceCreateThumbnailAtIndex(incrementSource, 0, thumb_options) {
            DispatchQueue.main.async {
                self.imageView.image = UIImage(cgImage: cgImage)
            }
        }
        default:
         break
    }
    bytes.deallocate() 
}

更多接口:https://developer.apple.com/documentation/imageio/cgimagesource-r84

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,613评论 8 265
  • ImageIO框架提供了读取与写入数据的基本方法,使用它可以直接获取到图片文件的内容数据,ImageIO框架...
    小猫仔阅读 1,996评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,012评论 3 119
  • 寂寞和美好让我们相遇 然后是生存把我们分开 当你的背影住在我的泪中 你告诉我,说—— 生活是为了改变生活 是啊是啊...
    乌托邦的梦阅读 116评论 0 0