UIImagePNGRepresentation(UIImage()) 返回 nil。

10
为什么UIImagePNGRepresentation(UIImage())返回nil
我试着在我的测试代码中创建UIImage(),以确保它被正确传递。
我比较两个UIImage的方法使用了UIImagePNGRepresentation(),但是出于某种原因,它返回nil
谢谢。

你是真的在尝试使用 UIImagePNGRepresentation(UIImage()) 吗?还是 UIImage() 只是一个已经创建好的 UIImage 的占位符? - Jojodmo
我有一个结构体,它被传递并包含一个UIImage。我将其属性设置为= UIImage()。然后稍后我会比较这个属性和其他一些UIImage。这个比较是通过UIImagePNGRepresentation(image1) == UIImagePNGRepresentation(image2)完成的。 - Rodrigo Ruiz
3个回答

12

UIImagePNGRepresentation()函数在提供的UIImage没有数据时会返回nil。根据UIKit文档:

返回值

一个包含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,并且它还必须有数据。

如果您想检查它们是否有任何数据,可以使用:

if(image == nil || image == UIImage()){
  //image is nil, or has no data
}
else{
  //image has data
}

如何检查图像是否有任何数据?由于 UIImagePNGRepresentation 如果传递了一个 UIImage(),它将会使应用程序崩溃... - Rodrigo Ruiz
这样不行,当我尝试比较 UIImagePNGRepresentation 返回的值时,应用程序崩溃了。 - Rodrigo Ruiz
我刚刚更新了我的回答,如果你想检查它们是否有任何数据,你可以检查 image == UIImage(),这实际上是检查图像是否等于没有数据的图像。 - Jojodmo
@RodrigoRuiz 我会给他们点赞,然后接受你认为将来对其他人最有帮助的那个。 - Jojodmo
你的回答对我理解问题非常有帮助(同时也帮助我修复了Comparison方法中的一个大问题。我应该为此添加测试...),他的回答在实际测试方面最有帮助。你能否编辑你的回答,说一些类似“关于测试方法,请看另一个回答”的话? - Rodrigo Ruiz
显示剩余4条评论

5

UIImage文档称:

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

由于您创建了UIImage而没有提供任何图像数据,所以您创建的对象对于图像来说没有意义。UIKit和Core Graphics似乎不允许0x0图像。

最简单的解决方法是创建一个1x1的图像:

UIGraphicsBeginImageContext(CGSizeMake(1, 1))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

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
        }

1
你怎么运行这段代码?pngData是一个let,UIImage上没有高度或宽度... - shvets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接