Redimensionar UIimages extraído da câmera também gira a interface do usuário?

Estou obtendo imagens UI da câmera e atribuindo-as ao UIImageViews para serem exibidas. Quando faço isso, a câmera me dá uma imagem de 1200 x 1600 pixels que eu atribuo a um UIImageView no meu aplicativo. A imagem é exibida como esperado na visualização da imagem sob essa condição. No entanto, quando tento resize o UIImage recuperado antes de atribuí-lo ao UIImageView, a imagem é redimensionada como esperado, mas há um problema em algum lugar (no código RESIZING?) Que meu UIImage está sendo ROTADO … Como resultado, quando eu atribuo o UIImage redimensionado a um UIImageView, a imagem é girada em 90 graus e aparece esticada, já que a relação de aspecto (1200 x 1600 pixels) não foi alterada …

Eu estou usando isso para obter um UIImage da câmera:

- (void) imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info { myImg = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; myResizedImg = [self resizeImage:myImg width:400 height:533]; [myImageView setImage:myResizedImg]; } 

Eu estou usando isso para redimensioná-lo:

 -(UIImage *)resizeImage:(UIImage *)anImage width:(int)width height:(int)height { CGImageRef imageRef = [anImage CGImage]; CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef); if (alphaInfo == kCGImageAlphaNone) alphaInfo = kCGImageAlphaNoneSkipLast; CGContextRef bitmap = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(imageRef), 4 * width, CGImageGetColorSpace(imageRef), alphaInfo); CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef); CGImageRef ref = CGBitmapContextCreateImage(bitmap); UIImage *result = [UIImage imageWithCGImage:ref]; CGContextRelease(bitmap); CGImageRelease(ref); return result; } 

PERGUNTA: Como redimensiono um UIImage puxado da câmera sem girar os pixels?

    A razão pela qual seu código não funciona é porque o imageOrientation no código que você tem não está sendo levado em consideração. Especificamente, se o imageOrientation for para a direita / esquerda, você precisará girar a imagem e trocar a largura / altura. Aqui está algum código para fazer isso:

     -(UIImage*)imageByScalingToSize:(CGSize)targetSize { UIImage* sourceImage = self; CGFloat targetWidth = targetSize.width; CGFloat targetHeight = targetSize.height; CGImageRef imageRef = [sourceImage CGImage]; CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef); CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef); if (bitmapInfo == kCGImageAlphaNone) { bitmapInfo = kCGImageAlphaNoneSkipLast; } CGContextRef bitmap; if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) { bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); } else { bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo); } if (sourceImage.imageOrientation == UIImageOrientationLeft) { CGContextRotateCTM (bitmap, radians(90)); CGContextTranslateCTM (bitmap, 0, -targetHeight); } else if (sourceImage.imageOrientation == UIImageOrientationRight) { CGContextRotateCTM (bitmap, radians(-90)); CGContextTranslateCTM (bitmap, -targetWidth, 0); } else if (sourceImage.imageOrientation == UIImageOrientationUp) { // NOTHING } else if (sourceImage.imageOrientation == UIImageOrientationDown) { CGContextTranslateCTM (bitmap, targetWidth, targetHeight); CGContextRotateCTM (bitmap, radians(-180.)); } CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef); CGImageRef ref = CGBitmapContextCreateImage(bitmap); UIImage* newImage = [UIImage imageWithCGImage:ref]; CGContextRelease(bitmap); CGImageRelease(ref); return newImage; } 

    Isso resizeá sua imagem e a rotacionará para a orientação correta. Se você precisar da definição para radianos, é:

     static inline double radians (double degrees) {return degrees * M_PI/180;} 

    A resposta que Daniel deu também está correta, mas sofre com o problema de não ser thread-safe, já que você está usando UIGraphicsBeginImageContext (). Como o código acima usa apenas funções CG, está tudo pronto. Eu também tenho uma function semelhante para resize e preencher corretamente as imagens – deixe-me saber se é isso que você está procurando.

    Nota: Eu recebi a function original deste post , e fiz algumas modificações para fazer o trabalho em JPEGs.

    Eu tive esse problema também com alguns dos códigos lá fora, eu encontrei este código que funciona, confira, deixe-me saber o que você encontra

     + (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize; { UIGraphicsBeginImageContext( newSize ); [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

    Swift 3

    Eu adiciono isso ao método didFinishPickingMediaWithInfo e uso a image sem me preocupar com a rotação.

     var image = info[UIImagePickerControllerOriginalImage] as! UIImage if (image.imageOrientation != .up) { UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale) image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) image = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() } 

    Se você quiser fazer uma imagem quadrada a partir de uma imagem retangular (não importa horizontal ou vertical) cortando-a pela largura ou altura em ambos os lados, use meu código. A diferença é que eu não me alongo, mas eu cultivo. Eu fiz do código superior por modificação:

     //Cropping _image to fit it to the square by height or width CGFloat a = _image.size.height; CGFloat b = _image.size.width; CGRect cropRect; if (!(a==b)) { if (a