【问题标题】:convert UIImage to NSData and back to UIImage将 UIImage 转换为 NSData 并返回 UIImage
【发布时间】:2013-11-29 13:24:02
【问题描述】:

我必须从数据库中填充表格单元格,并且图像在设备上。 我必须将该图像存储在imageDataObject 中,如何将UIImage 转换为NSData。 请建议,我尝试了很多解决方案,但没有将NSData 转换回UIImage

    cell.textLabel.text = [[offlineImageListArray objectAtIndex:indexPath.row] imageName];
    UIImage *thumbnail = [self retrieveImageFromDevice:[[offlineImageListArray objectAtIndex:indexPath.row] imageName]];
    NSData* data = ??????????;
    ImageData *imageDataObject = [[ImageData alloc] initWithImageId:[[offlineImageListArray objectAtIndex:indexPath.row]imageId] 
    imageName:[[offlineImageListArray objectAtIndex:indexPath.row] imageName] imageData:data];
    [imagesArray addObject:imageDataObject];

【问题讨论】:

标签: ios uiimage nsdata


【解决方案1】:

从图像转换数据:

根据您的图像格式尝试 JPEG 或 PNG 表示:

UIImageJPEG表示

以 JPEG 格式返回指定图像的数据。

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNG 表示

以PNG格式返回指定图像的数据

NSData * UIImagePNGRepresentation (
   UIImage *image
);

示例:

extension UIImage {

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

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

用途:

let data = myImage.jpegRepresentationData
let data1 = myImage.pngRepresentationData

从数据转换图像:

let image = UIImage(data: data)

【讨论】:

    【解决方案2】:

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

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

    注意:Data 是 Swift 3 类。使用 Data 而不是 NSData 斯威夫特 3

    通用图像操作(如 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...
         }
    }
    

    【讨论】:

      【解决方案3】:

      在 Swift 版本中:

          let imageData = UIImagePNGRepresentation(image!)!
          let imageFromData = UIImage(data: imageData)
      

      【讨论】:

      • 简单,有效!谢谢!
      【解决方案4】:

      试试这个:

      使用它来将UIImage 转换为NSData

        NSData *imagedata = UIImagePNGRepresentation(thumbnail);
      

      试试这个将图像数据转换回UIImage

        UIImage *image= [UIImage imageWithData:imagedata];
      

      【讨论】:

      • 我怎么知道 UIImage 是 PNG?如果是JPEG怎么办?
      • 一个 UIImage 既不是 jpg 也不是 png。这是一个原始位图。 PNG 和 JPG 是一种以较小格式传输图像的格式
      【解决方案5】:

      要将UIImage 转换为NSData,请使用UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality)UIImagePNGRepresentation(UIImage *image)

      要将NSData 转换为UIImage,请使用[UIImage imageWithData:imageData]

      所以您的示例可能如下所示:

      cell.textLabel.text = [[offlineImageListArray objectAtIndex:indexPath.row] imageName];
      UIImage *thumbnail = [self retrieveImageFromDevice:[[offlineImageListArray objectAtIndex:indexPath.row] imageName]];
      NSData* data = UIImagePNGRepresentation(thumbnail);
      ImageData *imageDataObject = [[ImageData alloc] initWithImageId:[[offlineImageListArray objectAtIndex:indexPath.row]imageId] imageName:[[offlineImageListArray objectAtIndex:indexPath.row] imageName] imageData:data];
      [imagesArray addObject:imageDataObject];
      

      参考:https://developer.apple.com/LIBRARY/IOS/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIImage_Class/Reference/Reference.html

      【讨论】:

      • 如果我不知道图像表示是 png 还是 jpg 怎么办?如果我也将UIImagePNGRepresentation 用于 jpg 是否有问题?
      • @János - 这不会造成问题。
      猜你喜欢
      • 2015-11-24
      • 2011-09-22
      • 2010-12-21
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多