将UIImage转换为NSData


170

我在我的应用程序中使用此代码,这将有助于我发送图像。

但是,我有一个带有图像的图像视图。我的文件中没有文件,但图像在我的身边。如何更改以下代码?谁能告诉我如何转换myimageNSData

// Attach an image to the email
NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];

2
UIImageJPEGRepresentation,UIImagePNGRepresentation均返回图像的nsdata ..
Himanshu Agnihotri

Answers:


286

请尝试以下方法之一,具体取决于您的图像格式:

UIImageJPEGRepresentation

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

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

UIImagePNGRepresentation

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

NSData * UIImagePNGRepresentation (
   UIImage *image
);

这里是文档

编辑:

如果要访问组成UIImage的原始字节,则可以使用以下方法:

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

这将为您提供图像RGB像素的低级表示。(CFBridgingRelease如果不使用ARC,请忽略该位)。


8
有没有一种方法可以仅以现有格式获取数据?
devios1 2013年

1
Xcode建议我使用ARC (id)CFBridgingRelease(CGDataProviderCopyData(provider))CDataRef返回的所有权CGDataProviderCopyData
mostruash 2014年

1
@mostruash:谢谢,我修改了我的答案以考虑到您的建议。
sergio 2014年

@sergio我没有使用非ARC Obj-C的经验,我想知道释放data是否足够或者是否仍然存在内存泄漏。
mostruash 2014年

1
这无济于事。仅当使用imageWithCIImage:初始化属性CIImage时,才设置该属性。同样,这不是直接使用的数据,而是另一个图像表示对象。
King-Wizard

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
我正在使用这条线,但是速度非常慢
user2128531 2013年

5
请注意,使用UIImagePNGRepresentation时,imageFlags(如imageOrientation)会丢失。这就是为什么首选UIImageJPEGRepresentation的原因。
Yony​​ 2014年

26

如果您在UIImageView中有图像,例如“ myImageView”,则可以执行以下操作:

使用UIImageJPEGRepresentation()或UIImagePNGRepresentation()转换图像,如下所示:

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

您还可以将此代码放入GCD块中,并在另一个线程中执行,以显示在此过程中的UIActivityIndi​​catorView ...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});

24

创建图像的参考。...

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

在图像视图中显示图像... imagedisplay是imageview的引用:

imagedisplay.image = rainyImage;

NSData通过传递UIImage参考将其转换为,并以浮点值提供压缩质量:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

Swift 4中的解决方案

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

cgImage.dataProvider数据如何编码?它似乎与的数据不同,UIImagePNGRepresentation并且UIImageJPEGRepresentation因为它不能像这样用于创建图像UIImage(data: imageData)
曼努埃尔

@Manuel不确定。我只是从Sergio的答案中转换了语法。塞尔吉奥可能会更好。
Charlton Provatas

我假设@Manuel,因为它使用的是CoreGraphics API,它提供的图像的数据表示层比UIImageJPEGRepresentation提供的低。但是我相信这种解决方案可以保留图像原来的编码格式,并且不会对其进行重新编码。
Charlton Provatas

1

结合使用if-let块和Data可以防止应用崩溃和代码安全执行,因为函数UIImagePNGRepresentation返回一个可选值。

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

注意:数据是Swift 3类。在Swift 3中使用数据代替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...
     }
}

0
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.