ver transferir puedo pasar las importar fotos con iphone cocoa-touch uiimagepngrepresentation

transferir - pasar fotos de iphone a pc windows 7



UIImagePNGRediciones de la presentación?/Imágenes giradas 90 grados (5)

Creé esta extensión UIImage para solucionar este problema con UIImagePNGRepresentation, en función de esta respuesta . Así que propongo usar esta clase func UIImage.PNGRepresentation(img: UIImage) lugar de UIKit func UIImagePNGRepresentation.

Código de Swift 3:

// MyUIImage.swift // MyEasyMovie-Public-App // // Created by Ahmed Zahraz on 19/12/2016. // Copyright © 2016 AhmedZahraz. All rights reserved. import Foundation import UIKit extension UIImage { public class func PNGRepresentation(_ img: UIImage) -> Data? { // No-op if the orientation is already correct if (img.imageOrientation == UIImageOrientation.up) { return UIImagePNGRepresentation(img); } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform:CGAffineTransform = CGAffineTransform.identity if (img.imageOrientation == UIImageOrientation.down || img.imageOrientation == UIImageOrientation.downMirrored) { transform = transform.translatedBy(x: img.size.width, y: img.size.height) transform = transform.rotated(by: CGFloat(M_PI)) } if (img.imageOrientation == UIImageOrientation.left || img.imageOrientation == UIImageOrientation.leftMirrored) { transform = transform.translatedBy(x: img.size.width, y: 0) transform = transform.rotated(by: CGFloat(M_PI_2)) } if (img.imageOrientation == UIImageOrientation.right || img.imageOrientation == UIImageOrientation.rightMirrored) { transform = transform.translatedBy(x: 0, y: img.size.height); transform = transform.rotated(by: CGFloat(-M_PI_2)); } if (img.imageOrientation == UIImageOrientation.upMirrored || img.imageOrientation == UIImageOrientation.downMirrored) { transform = transform.translatedBy(x: img.size.width, y: 0) transform = transform.scaledBy(x: -1, y: 1) } if (img.imageOrientation == UIImageOrientation.leftMirrored || img.imageOrientation == UIImageOrientation.rightMirrored) { transform = transform.translatedBy(x: img.size.height, y: 0); transform = transform.scaledBy(x: -1, y: 1); } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. let ctx:CGContext = CGContext(data: nil, width: Int(img.size.width), height: Int(img.size.height), bitsPerComponent: img.cgImage!.bitsPerComponent, bytesPerRow: 0, space: img.cgImage!.colorSpace!, bitmapInfo: img.cgImage!.bitmapInfo.rawValue)! ctx.concatenate(transform) if (img.imageOrientation == UIImageOrientation.left || img.imageOrientation == UIImageOrientation.leftMirrored || img.imageOrientation == UIImageOrientation.right || img.imageOrientation == UIImageOrientation.rightMirrored ) { ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.height,height:img.size.width)) } else { ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.width,height:img.size.height)) } // And now we just create a new UIImage from the drawing context let cgimg:CGImage = ctx.makeImage()! let imgEnd:UIImage = UIImage(cgImage: cgimg) return UIImagePNGRepresentation(imgEnd) } }

Quiero cargar imágenes de UIImagePickerController, luego guardar la foto seleccionada en el directorio de documentos de mi aplicación.

UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; NSData *data1 = UIImagePNGRepresentation(image); NSString *fileName = "1.png"; NSString *path = //get Document path, then add fileName BOOL succ = [data1 writeToFile:path atomically:YES];

pero después de guardar la imagen en mi documento, descubrí que la imagen se giró 90 grados, luego cambié el método UIImagePNGRpresentación a UIImageJPEGRepresentation, esta vez está bien, ¿alguien sabe cuál es el problema?


La siguiente función rápida resuelve el problema.

var rotatedCopy: UIImage { if (imageOrientation == UIImageOrientation.Up) { return self } UIGraphicsBeginImageContext(size) drawInRect(CGRect(origin: CGPoint.zeroPoint, size: size)) let copy = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return copy }

Sí, es así de simple, solo porque la función drawInRect tendrá en cuenta la orientación de la imagen.


Prueba este:

func rotateImage(image: UIImage) -> UIImage { if (image.imageOrientation == UIImageOrientation.Up ) { return image } UIGraphicsBeginImageContext(image.size) image.drawInRect(CGRect(origin: CGPoint.zero, size: image.size)) let copy = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return copy }


Resuelvo este problema con el siguiente código.

- (UIImage *)scaleAndRotateImage:(UIImage *)image { int kMaxResolution = 640; CGImageRef imgRef = image.CGImage; CGFloat width = CGImageGetWidth(imgRef); CGFloat height = CGImageGetHeight(imgRef); CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); if (width > kMaxResolution || height > kMaxResolution) { CGFloat ratio = width/height; if (ratio > 1) { bounds.size.width = kMaxResolution; bounds.size.height = bounds.size.width / ratio; } else { bounds.size.height = kMaxResolution; bounds.size.width = bounds.size.height * ratio; } } CGFloat scaleRatio = bounds.size.width / width; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = image.imageOrientation; switch(orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatio); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatio); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; }


Tuve el mismo problema y me di cuenta de la razón: comenzando con iOS 4.0 cuando la cámara toma una foto, no la rota antes de guardarla, simplemente establece un indicador de rotación en los datos EXIF ​​de JPEG.

Si guarda un UIImage como JPEG, establecerá el indicador de rotación.

Los PNG no admiten un indicador de rotación, por lo que si guarda un UIImage como PNG, se rotará incorrectamente y no tendrá un indicador configurado para corregirlo. Entonces, si quieres PNG, debes rotarlos tú mismo.

Llamaría a esto un error en la función de guardado de PNG, pero eso es solo una opinión (al menos deberían advertirte sobre esto).