尝试让以下代码生效:
导入ImageIO
if let imageSource = CGImageSourceCreateWithURL(self.URL, nil) {
let options: CFDictionary = [
kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height) / 2.0,
kCGImageSourceCreateThumbnailFromImageIfAbsent: true
]
let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options).flatMap { UIImage(CGImage: $0) }
}
我需要知道如何正确初始化CFDictionary
。不幸的是,它似乎并不像我预测的那么容易。
我做了一些实验和研究,似乎存在相互矛盾的信息。
对于初学者,这里是关于kCGImageSourceThumbnailMaxPixelSize
密钥的Apple文档中的条目:
kCGImageSourceThumbnailMaxPixelSize
缩略图的最大宽度和高度(以像素为单位)。如果未指定此键,则缩略图的宽度和高度不受限制,缩略图可能与图像本身一样大。如果存在,则此键必须是CFNumber值。可以在传递给函数CGImageSourceCreateThumbnailAtIndex的选项字典中提供此密钥。
在查看如何初始化CFNumber
之后,我找到了CFNumber
的摘录
CFNumber与其可可基金会同行NSNumber进行“免费桥接”。这意味着Core Foundation类型在函数或方法调用中可与桥接的Foundation对象
互换
然后我尝试这样做:
let options: CFDictionary = [
kCGImageSourceThumbnailMaxPixelSize: NSNumber(double: 3.0)
]
并受到错误消息的欢迎:'_' is not convertible to 'CFString!'
和Type of expression is ambiguous without more context
。
答案 0 :(得分:3)
这是您的工作代码:
func processImage(jpgImagePath: String, thumbSize: CGSize) {
if let path = NSBundle.mainBundle().pathForResource(jpgImagePath, ofType: "") {
if let imageURL = NSURL(fileURLWithPath: path) {
if let imageSource = CGImageSourceCreateWithURL(imageURL, nil) {
let maxSize = max(thumbSize.width, thumbSize.height) / 2.0
let options : [NSString : AnyObject] = [
kCGImageSourceThumbnailMaxPixelSize: maxSize,
kCGImageSourceCreateThumbnailFromImageIfAbsent: true
]
let scaledImage = UIImage(CGImage: CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options))
// do other stuff
}
}
}
}
来自文档:
来自桥接的Objective-C类的隐式转换 (NSString / NSArray / NSDictionary)给它们对应的Swift值 类型(字符串/数组/字典)已被删除,使得Swift 类型系统更简单,更可预测。
您的案例中的问题是CFStrings
,例如kCGImageSourceThumbnailMaxPixelSize
。这些不再自动转换为String。
来自HERE的参考。