converter UIImage para NSData

170

Estou usando esse código no meu aplicativo que me ajudará a enviar uma imagem.

No entanto, eu tenho uma visualização de imagem com uma imagem. Não tenho nenhum arquivo no appbundle, mas tenho a imagem ao meu lado. Como posso alterar o código abaixo? Alguém pode me dizer como posso converter myimagepara NSData?

// 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"];
Christina
fonte
2
UIImageJPEGRepresentation, UIImagePNGRepresentation tanto NSData retorno da imagem .....
Himanshu Agnihotri

Respostas:

286

Tente um dos seguintes, dependendo do formato da imagem:

UIImageJPEGRepresentation

Retorna os dados para a imagem especificada no formato JPEG.

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

UIImagePNGRepresentation

Retorna os dados para a imagem especificada no formato PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Aqui os documentos .

EDITAR:

se você deseja acessar os bytes brutos que compõem o UIImage, você pode usar esta abordagem:

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

Isso fornecerá a representação de baixo nível dos pixels RGB da imagem. (Omita o CFBridgingReleasebit se você não estiver usando o ARC).

sergio
fonte
8
Existe uma maneira de obter os dados em qualquer formato que já esteja?
devios1
1
O Xcode sugere que eu use (id)CFBridgingRelease(CGDataProviderCopyData(provider))a propriedade de CDataRefretornado pelo CGDataProviderCopyDataARC.
Mostruash
1
@mostruash: obrigado, eu modifiquei minha resposta para levar em conta sua sugestão.
sergio
@ergio Não tenho experiência com Obj-C não-ARC e gostaria de saber se a liberação dataseria suficiente ou se ainda haveria um vazamento de memória.
Mostruash
1
Isso não vai ajudar. A propriedade CIImage será configurada apenas se tiver sido inicializada com imageWithCIImage :. Além disso, esses dados não são diretamente usados, mas outro objeto de representação de imagem.
King-Wizard
161
NSData *imageData = UIImagePNGRepresentation(myImage.image);
Radix
fonte
4
Eu estou usando esta linha, mas isso é muito lento #
21413
5
Observe que imageFlags (como imageOrientation) se perdem ao usar UIImagePNGRepresentation. É por isso que UIImageJPEGRepresentation é preferido.
Yony
26

Se você tem uma imagem dentro de um UIImageView, por exemplo, "myImageView", você pode fazer o seguinte:

Converta sua imagem usando UIImageJPEGRepresentation () ou UIImagePNGRepresentation () como este:

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).

Você também pode colocar esse código dentro de um bloco GCD e executar em outro thread, mostrando um UIActivityIndicatorView durante o processo ...

//*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*
    });
});
FormigaNinja
fonte
24

Crie a referência da imagem ....

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

exibindo imagem na visualização de imagem ... imagedisplay é referência do imageview:

imagedisplay.image = rainyImage;

converta-o NSDatapassando UIImagereferência e forneça qualidade de compactação em valores flutuantes:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Jemythehigh
fonte
2

Solução no Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
Charlton Provatas
fonte
Como os cgImage.dataProviderdados são codificados? Parece ser diferente dos dados UIImagePNGRepresentatione UIImageJPEGRepresentationporque não pode ser usado para criar uma imagem como essa UIImage(data: imageData).
Manuel
@Manuel Não tenho certeza. Acabei de converter a sintaxe da resposta de Sergio. Sergio provavelmente saberia melhor.
Charlton Provatas
@Manuel Estou assumindo que, por usar a API CoreGraphics, está fornecendo uma representação de dados de nível inferior da imagem do que o que UIImageJPEGRepresentationfornece. Mas acredito que esta solução preserva o formato de codificação original em que a imagem estava e não a recodifica.
Charlton Provatas
1

Use o bloco if-let com Data para impedir a falha do aplicativo e a execução segura do código, pois a função UIImagePNGRepresentation retorna um valor opcional.

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

Nota: Os dados são da classe Swift 3. Use Dados em vez de NSData com Swift 3

Operações genéricas de imagem (como png e 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...
     }
}

Usando a extensão:

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...
     }
}
Krunal
fonte
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];
    }
Jayesh Mardiya
fonte