Swift 相位设置为UIImage
我试图从一个相集创建一个UIImage(比如缩略图或其他东西),这样我就可以将它传递到一个获取UIImage的东西中。我已经尝试过调整我在SO上找到的解决方案(因为它们都只是直接将其传递到tableview或其他东西中),但没有成功(可能是因为我做得不对) 打印人员告诉我manager.request行现在没有做任何事情。如何让它将资产作为UIImage提供给我Swift 相位设置为UIImage,swift,phasset,Swift,Phasset,我试图从一个相集创建一个UIImage(比如缩略图或其他东西),这样我就可以将它传递到一个获取UIImage的东西中。我已经尝试过调整我在SO上找到的解决方案(因为它们都只是直接将其传递到tableview或其他东西中),但没有成功(可能是因为我做得不对) 打印人员告诉我manager.request行现在没有做任何事情。如何让它将资产作为UIImage提供给我 谢谢。问题在于requestImageForAsset是一个resultHandler,这段代码将在函数打印并返回预期值后发生。我来这
谢谢。问题在于requestImageForAsset是一个resultHandler,这段代码将在函数打印并返回预期值后发生。我来这里是为了向你们展示这种情况,并提出一些简单的解决方案
func getAssetThumbnail(asset: PHAsset) {
var retimage = UIImage()
println(retimage)
let manager = PHImageManager.defaultManager()
manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: nil, resultHandler: {
(result, info)->Void in
retimage = result
println("This happens after")
println(retimage)
callReturnImage(retimage) // <- create this method
})
println("This happens before")
}
func getAssetThumbnail(资产:PHAsset){
var retimage=UIImage()
println(重成像)
let manager=PHImageManager.defaultManager()
manager.requestImageForAsset(资产,targetSize:CGSize(宽度:100.0,高度:100.0),contentMode:.AspectFit,选项:nil,resultHandler:{
(结果,信息)->在中无效
重成像=结果
println(“这发生在之后”)
println(重成像)
callReturnImage(retimage)//这就是我需要它做的,以防任何人也需要它
func getAssetThumbnail(asset: PHAsset) -> UIImage {
let manager = PHImageManager.defaultManager()
let option = PHImageRequestOptions()
var thumbnail = UIImage()
option.synchronous = true
manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: option, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
编辑:Swift 3更新
我建议使用苹果的(继承自PHImageManager):
PHCachingImageManager对象为照片或视频资产获取或生成图像数据
另外,phcachingimanager支持更好的缓存机制
获取缩略图的示例:
let options = PHImageRequestOptions()
options.deliveryMode = .HighQualityFormat
options.synchronous = true // Set it to false for async callback
let imageManager = PHCachingImageManager()
imageManager.requestImageForAsset(YourPHAssetVar,
targetSize: CGSizeMake(CGFloat(160), CGFloat(160)),
contentMode: .AspectFill,
options: options,
resultHandler: { (resultThumbnail : UIImage?, info : [NSObject : AnyObject]?) in
// Assign your thumbnail which is the *resultThumbnail*
}
此外,您还可以使用PHCachingImageManager来缓存图像,以实现更快的UI响应:
要使用缓存图像管理器,请执行以下操作:
创建PHCachingImageManager实例。(此步骤替换使用
共享的PHImageManager实例。)
使用PHAsset类方法获取您感兴趣的资产
要为这些资产准备图像,请调用
StartChinaGimagesForasets:targetSize:contentMode:options:method
具有目标大小、内容模式和您计划在以下情况下使用的选项:
稍后为每个单独的资产请求图像
当您需要单个资产的图像时,请调用
requestImageForAsset:targetSize:contentMode:options:resultHandler:
方法,并传递准备时使用的相同参数
资产
如果您请求的图像是已经准备好的图像,则
PHCachingImageManager对象立即返回该图像。
否则,照片会按需准备图像并将其缓存以备以后使用
使用
在我们的例子中:
var phAssetArray : [PHAsset] = []
for i in 0..<assets.count
{
phAssetArray.append(assets[i] as! PHAsset)
}
let options = PHImageRequestOptions()
options.deliveryMode = .Opportunistic
options.synchronous = false
self.imageManager.startCachingImagesForAssets(phAssetArray,
targetSize: CGSizeMake(CGFloat(160), CGFloat(160)),
contentMode: .AspectFill,
options: options)
var phAssetArray:[PHAsset]=[]
对于Swift 3.0.1中的i..
func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
let retinaScale = UIScreen.main.scale
let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//(size * retinaScale, size * retinaScale)
let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
let square = CGRect(x:0, y: 0,width: CGFloat(cropSizeLength),height: CGFloat(cropSizeLength))
let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
var thumbnail = UIImage()
options.isSynchronous = true
options.deliveryMode = .highQualityFormat
options.resizeMode = .exact
options.normalizedCropRect = cropRect
manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
thumbnail = result!
})
return thumbnail
}
参考资料:试试这个,它对我有用,希望它也能帮助你
func getUIImage(asset: PHAsset) -> UIImage? {
var img: UIImage?
let manager = PHImageManager.default()
let options = PHImageRequestOptions()
options.version = .original
options.isSynchronous = true
manager.requestImageData(for: asset, options: options) { data, _, _, _ in
if let data = data {
img = UIImage(data: data)
}
}
return img
}
Objective-c版代码基于dcheng答案
-(UIImage *)getAssetThumbnail:(PHAsset * )asset {
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.synchronous = true;
__block UIImage *image;
[PHCachingImageManager.defaultManager requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
image = result;
}];
return image;
}
斯威夫特4
resizeMode
,deliveryMode
-可根据用户需求进行设置
isNetworkAccessAllowed
-将此设置为“true”以从云中获取图像
imageSize
-所需的图像大小
func getImageFromAsset(asset:PHAsset,imageSize:CGSize, callback:@escaping (_ result:UIImage) -> Void) -> Void{
let requestOptions = PHImageRequestOptions()
requestOptions.resizeMode = PHImageRequestOptionsResizeMode.fast
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryMode.highQualityFormat
requestOptions.isNetworkAccessAllowed = true
requestOptions.isSynchronous = true
PHImageManager.default().requestImage(for: asset, targetSize: imageSize, contentMode: PHImageContentMode.default, options: requestOptions, resultHandler: { (currentImage, info) in
callback(currentImage!)
})
}
简单解决方案(Swift 4.2)
方法1:
extension PHAsset {
var image : UIImage {
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { image, _ in
thumbnail = image!
})
return thumbnail
}
}
let image = asset.image
extension PHAsset {
var data : (UIImage, [AnyHashable : Any]) {
var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { image,info in
img = image!
information = info!
})
return (img,information)
}
}
let image_withData : (UIImage, [AnyHashable : Any]) = asset.data
如果您只需要从PHAsset
获取UIImage
,请使用此方法
或
extension PHAsset {
func image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> UIImage {
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image, _ in
thumbnail = image!
})
return thumbnail
}
}
let image = asset.image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
extension PHAsset {
func image(completionHandler: @escaping (UIImage) -> ()){
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { img, _ in
thumbnail = img!
})
completionHandler(thumbnail)
}
}
let image = asset.image(completionHandler: {(img) in
print("Finished")
})
extension PHAsset {
func data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> (UIImage, [AnyHashable : Any]) {
var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image,info in
img = image!
information = info!
})
return (img,information)
}
}
let data = asset?.data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
将此方法用于所需的UIImage
或
extension PHAsset {
func image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> UIImage {
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image, _ in
thumbnail = image!
})
return thumbnail
}
}
let image = asset.image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
extension PHAsset {
func image(completionHandler: @escaping (UIImage) -> ()){
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { img, _ in
thumbnail = img!
})
completionHandler(thumbnail)
}
}
let image = asset.image(completionHandler: {(img) in
print("Finished")
})
extension PHAsset {
func data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> (UIImage, [AnyHashable : Any]) {
var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image,info in
img = image!
information = info!
})
return (img,information)
}
}
let data = asset?.data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
使用此方法在完成后通知
方法2:
extension PHAsset {
var image : UIImage {
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { image, _ in
thumbnail = image!
})
return thumbnail
}
}
let image = asset.image
extension PHAsset {
var data : (UIImage, [AnyHashable : Any]) {
var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { image,info in
img = image!
information = info!
})
return (img,information)
}
}
let image_withData : (UIImage, [AnyHashable : Any]) = asset.data
如果需要UIImage
和PHAsset
或
extension PHAsset {
func image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> UIImage {
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image, _ in
thumbnail = image!
})
return thumbnail
}
}
let image = asset.image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
extension PHAsset {
func image(completionHandler: @escaping (UIImage) -> ()){
var thumbnail = UIImage()
let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { img, _ in
thumbnail = img!
})
completionHandler(thumbnail)
}
}
let image = asset.image(completionHandler: {(img) in
print("Finished")
})
extension PHAsset {
func data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> (UIImage, [AnyHashable : Any]) {
var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image,info in
img = image!
information = info!
})
return (img,information)
}
}
let data = asset?.data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
对所需数据使用此方法。Swift 5
extension PHAsset {
func getAssetThumbnail() -> UIImage {
let manager = PHImageManager.default()
let option = PHImageRequestOptions()
var thumbnail = UIImage()
option.isSynchronous = true
manager.requestImage(for: self,
targetSize: CGSize(width: self.pixelWidth, height: self.pixelHeight),
contentMode: .aspectFit,
options: option,
resultHandler: {(result, info) -> Void in
thumbnail = result!
})
return thumbnail
}
}
仍然有点困惑。所以我们正在更改getAssetThumbnail以不返回任何内容?在这种情况下,我们将如何将重映像传递给我们需要的内容?何时以及如何执行该块以获得有用的内容。希望callReturnImage与我们尝试将重映像传递给的其他函数分开。您不能返回在检索之前,您的返回将发生,请添加另一个函数,该函数可以对图像执行您想要执行的操作,或者在完成块中添加您想要对图像执行的操作。这是解决此问题的两种更简单的方法。对。好吧,假设我有两个函数(x&y)这两个都需要UIImages。我希望它们对我们在该块中创建的UIImages进行操作。我是否不可能在该块之外通过将UIImages传递到x&y并从请求方法获取该图像来完成此操作?或者我必须将x&y作为您暗示的callReturnImage函数。如果不可能,那么如果我是要在将来创建函数z,我不是必须回去编辑这个函数才能工作吗?我不是说这是不可能的,我是说这是一种更简单的方法,你可以创建函数,也可以返回完成块,但问题对你来说只会变得更大,我会在答案中发布一个链接,这样你就可以了解更多le,假设我想这样做:var image=a.getAssetThumbnail(firstAsset)我如何才能做到这一点?如果有人需要更多信息,请查看苹果的示例代码:如何获得相位集的原始宽度+高度?我还想知道如何获得原始宽度和高度,您找到解决方案了吗,@TimNuwin?如果您谈论的是pixelWidth和pixelHeight属性,那么这就是您要使用的。如果不是,我需要更多的信息来帮助。希望这个链接有帮助:你可以通过设置PHImageManagerMaximumSize为targetSize来获取原始图像。@BorutTomazin我似乎遇到了一个奇怪的崩溃,这个应用程序在从主线程访问引擎后从后台线程修改自动布局引擎。这可能会导致d导致引擎损坏和奇怪的崩溃。
当我更改targetSize
时,我收到了错误“