22

我正在尝试保存 UIIMage 然后检索它并显示它。通过将图像保存在包中,从那里检索并显示,我已经成功了。我的问题来自于我尝试将图像保存到磁盘(将其转换为 NSData),然后检索它。我像这样将图像转换为 NSData ...

NSData* topImageData = UIImageJPEGRepresentation(topImage, 1.0);

然后我像这样将它写入磁盘......

[topImageData writeToFile:topPathToFile atomically:NO];

然后我试着像这样检索它......

topSubView.image = [[UIImage alloc] initWithContentsOfFile:topPathToFile];

它不返回任何图像(大小为零)。然后我尝试了...

NSData *data = [[NSData alloc] initWithContentsOfFile:topPathToFile];
topSubView.image = [[UIImage alloc] initWithData:data];

无济于事。当我逐步通过调试器时,我确实看到数据包含正确的字节数,但我对为什么没有创建我的图像感到困惑。我错过了一步吗?在转换为图像之前,我是否需要对 NSData 做一些事情?

4

5 回答 5

34

试试这个代码。这对我有用。

保存数据。

创建保存图像的路径。

let libraryDirectory = NSSearchPathForDirectoriesInDomains(.libraryDirectory,
                                                               .userDomainMask,
                                                               true)[0]
let libraryURL = URL(fileURLWithPath: libraryDirectory, isDirectory: true)
let fileURL = libraryURL.appendingPathComponent("image.data")

将图像转换为 Data 对象并将其保存到文件中。

let data = UIImageJPEGRepresentation(myImage, 1.0)
try? data?.write(to: fileURL)

检索保存的图像

let newImage = UIImage(contentsOfFile: fileURL.relativePath)

创建一个图像视图并使用检索到的图像加载它。

let imageView = UIImageView(image: newImage)
self.view.addSubview(imageView)
于 2011-04-19T06:59:40.267 回答
19

您应该能够使用 UIImage 的类方法

[UIImage imageWithContentsOfFile:topPathToFile]; 

或者

[UIImage imageWithData:data];

那没有用吗?

希望这可以帮助!

于 2010-02-10T23:23:46.340 回答
7

以防万一这有助于某人,从 iOS6 我们有 imageWithData:scale 方法。要从 NSData 对象获取具有正确比例的 UIImage,请使用该方法,声明用于存储原始图像的比例。例如:

CGFloat screenScale = [[UIScreen mainScreen] scale];
UIImage *image = [UIImage imageWithData:myimage scale:screenScale];

这里,myimage 是存储原始图像的 NSData 对象。在示例中,我使用了屏幕的比例。如果您对原始图像使用其他比例,请改用该值。

于 2014-02-08T01:26:59.583 回答
0

看看这个:http ://www.nixwire.com/getting-uiimage-to-work-with-nscoding-encodewithcoder/ 。

它正是我认为解决您问题的方法。你不能只用 NSData 制作图像,即使这是常识所暗示的。你必须使用 UIImagePNGRepresentation。让我知道这是否有帮助。

于 2011-02-06T08:44:37.497 回答
0

使用带有数据的 if-let 块来防止应用程序崩溃和安全执行代码,因为函数 UIImagePNGRepresentation 返回一个可选值。

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

注意:数据是 Swift 3+ 类。在 Swift 3+ 中使用 Data 而不是 NSData

通用图像操作(如 png 和 jpg 两者):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

通过使用扩展:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}
于 2017-10-27T08:55:14.760 回答