2013-08-26 6 views
7

Ich versuche ein aufgenommenes Bild zu bearbeiten und es in der Galerie zu speichern. Ich habe gemachtZuschneiden UIImagePickerControllerOriginalImage mit UIImagePickerControllerCropRect gibt ein falsches Bild zurück

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

Ich möchte das Bild in den bearbeitbaren quadratischen Teil speichern und speichern Sie es in der Galerie. Ich weiß, dass ich [info objectForKey:@"UIImagePickerControllerEditedImage"] verwenden kann, um das editierte Bild zu speichern. Aber das gibt mir immer ein Bild der Dimension 320x320 (iPad Mini) und das Bild ist von schlechter Qualität. So wollte ich das ursprüngliche Bild zuzuschneiden [info objectForKey:@"UIImagePickerControllerOriginalImage"] durch den folgenden Code:

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); 

Dann gespeichert Ich sowohl das Ergebnisbild und das bearbeitete Bild ([info objectForKey:@"UIImagePickerControllerEditedImage"]). Wenn beide Bilder verglichen werden, stimmen sie nicht überein. Ich habe die bearbeiteten und beschnittenen Bilder angehängt. Mein oberstes Ziel ist es, das Originalbild auf das Bild im editierbaren quadratischen Bereich zuzuschneiden und es in der Galerie mit guter Bildqualität zu speichern. Kann mir bitte jemand sagen, was genau hier schief geht und mir helfen, dieses Problem zu beheben?

Vielen Dank im Voraus.

cropped Image

Edited Image

+9

ich ein ähnliches Problem hatte und schrieb nur ein Radar und deaktiviert die Bearbeitung. Dann habe ich meine Tastatur gereinigt: p – fzwo

+0

Ich würde mich freuen, wenn Sie genauer auf die Lösung eingehen können. Ich brauche es dringend. – CrazyDeveloper

+1

Wie gesagt, ich habe aufgegeben, einen Fehlerbericht auf https://bugreport.apple.com (intern heißt der Apple Bug Tracker heißt "Radar") abgelegt und bin dann ohne ihn weitergegangen. Wenn ich wirklich, wirklich die Funktionalität brauchte, würde ich nach Open-Source-Komponenten suchen, die es duplizieren, oder es selbst schreiben. Ich muss allerdings zugeben, dass es irgendwie komisch ist, dass man keine * Antworten * bekommt. Haben Sie auf der Website nach anderen Problemen mit dem gleichen Problem gesucht? – fzwo

Antwort

2

fand ich den Grund, warum Zuschneiden falsch hier ging. Das Bild, das von UIImagePickerControllerOriginalImage zurückgegeben wird, wird auf -90 Grad gedreht. Das Zuschneiden des gedrehten Bildes hat mir ein falsch zugeschnittenes Bild zurückgegeben. Also habe ich das Bild um 90 Grad gedreht und dann abgeschnitten. Endlich hatte ich das erwartete beschnittene Bild mit guter Qualität. Der folgende Code löste meine Ausgabe.

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]; 

Code Bild drehen:

- (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; 
} 
Verwandte Themen