convertir UIImage en NSData
J'utilise ce code dans mon application qui m'aidera à envoyer une image.
Cependant, j'ai une vue d'image avec une image. Je n'ai aucun fichier dans appbundle mais l'image de mon côté. Comment puis-je changer le code ci-dessous ? Quelqu'un peut me dire comment puis-je convertir myimage
à 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"];
7 réponses
Essayez l'une des options suivantes, en fonction du format de votre image:
UIImageJPEGRepresentation
Renvoie les données de l'image spécifiée au format JPEG.
NSData * UIImageJPEGRepresentation (
UIImage *image,
CGFloat compressionQuality
);
UIImagePNGRepresentation
Renvoie les données de l'image spécifiée au format PNG
NSData * UIImagePNGRepresentation (
UIImage *image
);
Modifier:
Si vous voulez accéder aux octets bruts qui composent L'UIImage, vous pouvez utiliser ceci approche:
CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];
Cela vous donnera la représentation de bas niveau des pixels RVB de l'image.
(Omettez le bit CFBridgingRelease
Si vous n'utilisez pas ARC).
Si vous avez une image dans un UIImageView, par exemple "myImageView" , vous pouvez faire ce qui suit:
Convertissez votre image en utilisant UIImageJPEGRepresentation () ou UIImagePNGRepresentation() comme ceci:
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).
Vous pouvez également placer ce code dans un bloc GCD et l'exécuter dans un autre thread, montrant un UIActivityIndicatorView pendant le processus ...
//*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*
});
});
Crée la référence de l'image....
UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];
Affichage de l'image dans la vue image... imagedisplay {[9] } est la référence de imageview:
imagedisplay.image = rainyImage;
Convertissez-le en NSData
en passant la référence UIImage
et fournissez une qualité de compression dans les valeurs flottantes:
NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Solution rapide 4
extension UIImage {
var data : Data? {
return cgImage?.dataProvider?.data as Data?
}
}
Utilisez le bloc if-let avec des données pour empêcher le crash de l'application et l'exécution sûre du code, car la fonction UIImagePNGRepresentation renvoie une valeur facultative.
if let img = UIImage(named: "TestImage.png") {
if let data:Data = UIImagePNGRepresentation(img) {
// Handle operations with data here...
}
}
Remarque: Data est la classe Swift 3. Utilisez Data au lieu de NSData avec Swift 3
Opérations D'image génériques (comme png et jpg les deux):
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...
}
}
En utilisant l'extension:
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...
}
}
- (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];
}