来自 UIImageView 的 jpegData() 为零
jpegData() from UIImageView is nil
我正在尝试从 UIImageView
中提取图像数据,以便将其上传到 Firebase 存储。但是,iv.image?.jpegData()
返回 nil。我正在使用标准 Kingfisher library 方法将图像从 URL 添加到 UIImageView
。
这是我的代码:
let url = URL(string: "https://pbs.twimg.com/profile_images/1229497999392477186/BMXkjVEJ_400x400.jpg")
let iv = UIImageView()
iv.kf.setImage(with: url)
if let png = iv.image?.jpegData(compressionQuality: .leastNormalMagnitude){
filePath.putData(png, metadata: nil){ metadata, error in
print("metadata: \(metadata) |error: \(error)") // doesn't print
}
}
知道为什么 iv.image?.jpegData()
是零吗?我也试过 iv.image?.pngData()
也是零。
作为
iv.kf.setImage(with: url)
是异步的 iv.image?.jpegData()/iv.image?.pngData()
在从服务器加载图像之前将为 nil
setImage
不会自动更改 image
属性。它可能必须从 Internet 下载图像,这需要时间。
幸运的是,您可以通过添加 completionHandler
:
来知道下载何时完成
iv.kf.setImage(with: url, completionHandler: { result in
guard case .success(let imageResource) = result else {
// an error has occurred!
return
}
if let png = imageResource.image.jpegData(compressionQuality: .leastNormalMagnitude){
filePath.putData(png, metadata: nil){ metadata, error in
print("metadata: \(metadata) |error: \(error)") // doesn't print
}
}
})
正如@Sh_Khan 所解释的,您需要等待 async
调用完成。这是修复:
let url = URL(string: "https://pbs.twimg.com/profile_images/1229497999392477186/BMXkjVEJ_400x400.jpg")
let iv = UIImageView()
iv.kf.setImage(with: url) { _ in
if let png = iv.image?.jpegData(compressionQuality: .leastNormalMagnitude){
filePath.putData(png, metadata: nil){ metadata, error in
print("metadata: \(metadata) |error: \(error)")
}
}
}
我正在尝试从 UIImageView
中提取图像数据,以便将其上传到 Firebase 存储。但是,iv.image?.jpegData()
返回 nil。我正在使用标准 Kingfisher library 方法将图像从 URL 添加到 UIImageView
。
这是我的代码:
let url = URL(string: "https://pbs.twimg.com/profile_images/1229497999392477186/BMXkjVEJ_400x400.jpg")
let iv = UIImageView()
iv.kf.setImage(with: url)
if let png = iv.image?.jpegData(compressionQuality: .leastNormalMagnitude){
filePath.putData(png, metadata: nil){ metadata, error in
print("metadata: \(metadata) |error: \(error)") // doesn't print
}
}
知道为什么 iv.image?.jpegData()
是零吗?我也试过 iv.image?.pngData()
也是零。
作为
iv.kf.setImage(with: url)
是异步的 iv.image?.jpegData()/iv.image?.pngData()
在从服务器加载图像之前将为 nil
setImage
不会自动更改 image
属性。它可能必须从 Internet 下载图像,这需要时间。
幸运的是,您可以通过添加 completionHandler
:
iv.kf.setImage(with: url, completionHandler: { result in
guard case .success(let imageResource) = result else {
// an error has occurred!
return
}
if let png = imageResource.image.jpegData(compressionQuality: .leastNormalMagnitude){
filePath.putData(png, metadata: nil){ metadata, error in
print("metadata: \(metadata) |error: \(error)") // doesn't print
}
}
})
正如@Sh_Khan 所解释的,您需要等待 async
调用完成。这是修复:
let url = URL(string: "https://pbs.twimg.com/profile_images/1229497999392477186/BMXkjVEJ_400x400.jpg")
let iv = UIImageView()
iv.kf.setImage(with: url) { _ in
if let png = iv.image?.jpegData(compressionQuality: .leastNormalMagnitude){
filePath.putData(png, metadata: nil){ metadata, error in
print("metadata: \(metadata) |error: \(error)")
}
}
}