UIImagePNGRepresentation(UIImage())返回nil

时间:2015-03-04 04:31:12

标签: swift uiimage uiimagepngrepresentation

为什么UIImagePNGRepresentation(UIImage())会返回nil

我正在尝试在我的测试代码中创建一个UIImage(),以断言它已被正确传递。

我对两个UIImage的比较方法使用UIImagePNGRepresentation(),但出于某种原因,它返回nil

谢谢。

3 个答案:

答案 0 :(得分:11)

如果提供的UIImage不包含任何数据,

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 documentation

  

图像对象是不可变的,因此您无法在创建后更改其属性。这意味着您通常在初始化时指定图像的属性,或者依赖图像的元数据来提供属性值。

由于您在未提供任何图像数据的情况下创建了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
        }