从UIImage获取底层NSData

eug*_*ene 98 cocoa-touch uiimage nsdata

我可以使用UIImageNSData方法从NSData创建UIImage .

我想知道我是否可以从现有的UIImage中获取NSData?什么就行了[UIImage imageWithData:]

Car*_*ine 187

NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
Run Code Online (Sandbox Code Playgroud)

要么

NSData *imageData = UIImagePNGRepresentation(image);
Run Code Online (Sandbox Code Playgroud)

具体取决于您是希望数据采用PNG格式还是JPG格式.

  • 我不知道为什么这个答案被多次投票,也不被接受.OP要求检索最初给出的数据.使用"UIImageJPEGRepresentation"或"UIImagePNGRepresentation"**将改变数据并进行重新转换.有没有办法真正实现所要求的? (75认同)
  • 这个答案并不好,因为如果图像已经处于有损格式,它将降低图像的质量. (6认同)
  • @CipherCom 我明白你所说的想要返回确切的数据。然而,我认为对于大多数遇到问题的人来说,这个答案将非常适合他们的需求......因此投票。如果您找到恢复原始数据的答案,请分享;) (2认同)

yes*_*eon 18

初始化UIImage对象时init(data: originalData),originalData将以某种内部格式转换为原始数据.以后可以使用这些数据进行检索

let rawData = myImage.cgImage?.dataProvider?.data as Data?
Run Code Online (Sandbox Code Playgroud)

然而,因为它rawData是原始的,它将比使用时更大UIImagePNGRepresentation.


Jim*_*oll 6

您可以预期UIImage是为显示格式化的对象,因此不会使用原始数据(可能是PNG或JPEG格式),但更可能是像素数组或其他内部格式.换句话说,UIImage(data: foo)不会保留foo.

  1. 如果你只是想在你的程序中的其他地方使用它,原来的UIImage会很好(我认为这不是这里的情况)

  2. 如果你想序列化,UIImagePNGRepresentation(...)可以工作但如果原件是JPEG则会超大; UIImageJPEGRepresentation(...)如果您的原始版本是PNG,则通常会导致数据略大,并且会略微有损.根据图像的显示方式和您希望提供的格式选择一个应该是可以的.如果您正好使用PNG并希望PNG输出,您应该获得一个好的文件大小和几乎相同的数据,除了特殊的PNG块.

  3. 如果您想获得原始数据的精确副本(可能是在缩略图后保存文件,或者是SHA1),那么您需要单独保留它.你可以这样做:

    var image:UIImage
    var imageData:NSData {
        didSet {
            image = UIImage(data: imageData)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


mas*_*vsa 6

斯威夫特 4.2

let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format

let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
Run Code Online (Sandbox Code Playgroud)


nsi*_*j22 5

只是因为我偶然发现了这个,所以我喜欢swift :)

这是卡洛琳的帖子的快速翻译。

var imageData = UIImagePNGRepresentation(image)
Run Code Online (Sandbox Code Playgroud)

要么

var imageData = UIImageJPEGRepresentation(image, 0.7) 
Run Code Online (Sandbox Code Playgroud)