2013-08-26 15 views
7

Sto cercando di modificare un'immagine acquisita e salvarla nella galleria. Ho effettuatoRitaglio UIImagePickerControllerOriginalImage utilizzando UIImagePickerControllerCropRect restituisce un'immagine errata

UIImagePickerController *picker=[[UIImagePickerController alloc] init]; 
picker.allowsEditting=YES; 

Desidero salvare l'immagine nella parte quadrata modificabile e salvarla nella galleria. So che posso fare uso di [info objectForKey:@"UIImagePickerControllerEditedImage"] per salvare l'immagine modificata. Ma questo mi restituisce sempre un'immagine della dimensione 320x320 (iPad Mini) e l'immagine è di scarsa qualità. Così ho pensato di ritagliare l'immagine originale [info objectForKey:@"UIImagePickerControllerOriginalImage"] utilizzando il seguente codice:

CGRect rect = [[info objectForKey:@"UIImagePickerControllerCropRect"]CGRectValue]; 
UIImage *originalImage=[info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], rect); 
UIImage *result = [UIImage imageWithCGImage:imageRef 
             scale:originalImage.scale 
           orientation:originalImage.imageOrientation]; 
CGImageRelease(imageRef); 

Poi ho salvato sia l'immagine risultato e l'immagine modificata ([info objectForKey:@"UIImagePickerControllerEditedImage"]). Se confrontate entrambe le immagini, corrispondono a dint. Ho allegato le immagini modificate e ritagliate. Il mio obiettivo finale è ritagliare l'immagine originale nell'immagine nella porzione quadrata modificabile e salvarla nella galleria con una buona qualità dell'immagine. Qualcuno può dirmi per favore su cosa esattamente va storto qui e aiutarmi a risolvere questo problema?

Grazie in anticipo. cropped Image

Edited Image

+9

Ho avuto un problema simile e appena scritto un radar e modifiche disabilitate. Quindi ho pulito la tastiera: p – fzwo

+0

, sarei grato se tu possa essere più specifico sulla soluzione. Ne ho molto bisogno. – CrazyDeveloper

+1

Come ho detto, mi sono arreso, ho presentato una segnalazione di bug su https://bugreport.apple.com (internamente, il bug tracker di Apple si chiama "Radar"), e si è trasferito senza di esso. Se davvero, davvero avevo bisogno della funzionalità, cercavo componenti open source che la duplicassero, o la scrissi da sola. Devo ammettere, però, che è un po 'strano che non riceverai * nessuna * risposta. Hai cercato sul sito per vedere se altri hanno avuto lo stesso problema? – fzwo

risposta

2

ho scoperto il motivo per cui il ritaglio è andato storto qui. L'immagine che viene restituita da UIImagePickerControllerOriginalImage viene ruotata a -90 gradi. Quindi ritagliare l'immagine ruotata mi ha restituito un'immagine ritagliata errata. Così ho ruotato l'immagine di 90 gradi e poi l'ho ritagliata. Finalmente ho avuto l'immagine ritagliata prevista con una buona qualità. Il codice seguente ha risolto il mio problema.

UIImage *originalImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    CGRect rect=[[info objectForKey:@"UIImagePickerControllerCropRect"]CGRectValue]; 
    UIImage *rotatedOriginalImage=[originalImage imageRotatedByDegrees:90.0]; 
    CGImageRef imageRef = CGImageCreateWithImageInRect([rotatedOriginalImage CGImage], rect) ; 
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef]; 

codice per ruotare l'immagine:

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees{ 
// calculate the size of the rotated view's containing box for our drawing space 
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.height, self.size.width)]; 
CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees)); 
rotatedViewBox.transform = t; 
CGSize rotatedSize = rotatedViewBox.frame.size; 


// Create the bitmap context 
UIGraphicsBeginImageContext(rotatedSize); 
CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

// Move the origin to the middle of the image so we will rotate and scale around the center. 
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); 

// // Rotate the image context 
CGContextRotateCTM(bitmap, DegreesToRadians(degrees)); 

// Now, draw the rotated/scaled image into the context 
CGContextScaleCTM(bitmap, 1.0, -1.0); 
CGContextDrawImage(bitmap, CGRectMake(-self.size.height/2, -self.size.width/2, self.size.height, self.size.width), [self CGImage]); 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return newImage; 
} 
Problemi correlati