objective c - guide - convertir UIImage a NSData
ios frameworks (7)
Estoy usando este código en mi aplicación que me ayudará a enviar una imagen.
Sin embargo, tengo una vista de imagen con una imagen. No tengo ningún archivo en el paquete pero tengo la imagen en mi lado. ¿Cómo puedo cambiar el código a continuación? ¿Alguien puede decirme cómo puedo convertir myimage
a 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"];
Crea la referencia de la imagen ...
UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];
visualización de la imagen en la vista de la imagen ... imagedisplay es referencia de la imagen:
imagedisplay.image = rainyImage;
NSData
en NSData
pasando la referencia de UIImage
y proporcionando calidad de compresión en los valores float:
NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Pruebe una de las siguientes opciones, según su formato de imagen:
UIImageJPEGRepresentation
Devuelve los datos para la imagen especificada en formato JPEG.
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
UIImagePNGRpresentación
Devuelve los datos para la imagen especificada en formato PNG
NSData * UIImagePNGRepresentation (
UIImage *image
);
EDITAR:
si desea acceder a los bytes sin procesar que componen el UIImage, puede usar este enfoque:
CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];
Esto le dará la representación de bajo nivel de los píxeles RGB de la imagen. (Omita el bit CFBridgingRelease
si no está utilizando ARC).
Si tiene una imagen dentro de UIImageView, por ejemplo, "myImageView", puede hacer lo siguiente:
Convierta su imagen usando UIImageJPEGRepresentation () o UIImagePNGRepresentation () de esta manera:
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).
También puede poner este código dentro de un bloque GCD y ejecutarlo en otro hilo, mostrando un UIActivityIndicatorView durante el proceso ...
//*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*
});
});
Utilice if-let block con Data para evitar el bloqueo de la aplicación y la ejecución segura del código, ya que la función UIImagePNGRepresentation devuelve un valor opcional.
if let img = UIImage(named: "TestImage.png") {
if let data:Data = UIImagePNGRepresentation(img) {
// Handle operations with data here...
}
}
Nota: Los datos son clase Swift 3. Usa datos en lugar de NSData con Swift 3
Operaciones genéricas de imagen (como png y jpg ambas):
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...
}
}
Al usar la extensión:
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...
}
}
Solución en Swift 4
extension UIImage {
var data : Data? {
return cgImage?.dataProvider?.data as Data?
}
}
- (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];
}
NSData *imageData = UIImagePNGRepresentation(myImage.image);