为什么UIImagePNGRepresentation(UIImage())
会返回nil
?
我正在尝试在我的测试代码中创建一个UIImage()
,以断言它已被正确传递。
我对两个UIImage的比较方法使用UIImagePNGRepresentation()
,但出于某种原因,它返回nil
。
谢谢。
答案 0 :(得分:11)
UIImagePNGRepresentation()
将返回nil
。来自UIKit Documentation:
返回值
包含PNG数据的数据对象,如果生成数据时出现问题,则为nil。 如果图像没有数据,或者底层CGImageRef包含不支持的位图格式的数据,则此函数可能返回nil。
只需使用UIImage()
初始化UIImage
,就会创建一个没有数据的UIImage
。虽然它不是nil
,但它仍然没有数据,因此UIImagePNGRepresentation()
无法返回任何数据,使其返回nil
。
要解决此问题,您必须使用UIImage
数据。例如:
var imageName: String = "MyImageName.png"
var image = UIImage(named: imageName)
var rep = UIImagePNGRepresentation(image)
imageName
是您的图片名称,包含在您的应用程序中。
要使用UIImagePNGRepresentation(image)
,image
不得为nil
,并且必须包含数据(UIImage()
创建的图片不是nil
,但没有任何数据。)
如果您想检查他们是否有任何数据,您可以使用:
if(image == nil || image == UIImage()){
//image is nil, or has no data
}
else{
//image has data
}
答案 1 :(得分:4)
图像对象是不可变的,因此您无法在创建后更改其属性。这意味着您通常在初始化时指定图像的属性,或者依赖图像的元数据来提供属性值。
由于您在未提供任何图像数据的情况下创建了UIImage
,因此您创建的对象与图像无关。 UIKit和Core Graphics似乎不允许使用0x0图像。
最简单的解决方法是创建一个1x1图像:
UIGraphicsBeginImageContext(CGSizeMake(1, 1))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
答案 2 :(得分:0)
我遇到了将UIImage转换为pngData的相同问题,但有时它返回nil。我只是通过创建图像副本来解决它
func getImagePngData(img : UIImage) -> Data {
let pngData = Data()
if let hasData = img.pngData(){
print(hasData)
pngData = hasData
}
else{
UIGraphicsBeginImageContext(img.size)
img.draw(in: CGRect(x: 0.0, y: 0.0, width: img.width,
height: img.height))
let resultImage =
UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
print(resultImage.pngData)
pngData = resultImage.pngData
}
return pngData
}