2013-08-26 34 views
7

我想編輯捕獲的圖像並將其保存到圖庫。我製作了使用UIImagePickerControllerCropRect裁剪UIImagePickerControllerOriginalImage返回不正確的圖像

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

我想將圖像保存在可編輯的方形部分並將其保存到圖庫。我知道我可以使用[info objectForKey:@"UIImagePickerControllerEditedImage"]來保存編輯後的圖像。但是,這總是會讓我看到尺寸爲320x320(iPad Mini)的圖像,並且圖像質量很差。所以,我打算通過使用下面的代碼裁剪原始圖像[info objectForKey:@"UIImagePickerControllerOriginalImage"]

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

然後我救了兩個結果圖像和編輯後的圖像([info objectForKey:@"UIImagePickerControllerEditedImage"])。當比較這兩幅圖像時,它們相互匹配。我附上了編輯和裁剪的圖像。我的最終目標是將原始圖像裁剪到可編輯的方形部分中的圖像上,並將其保存爲圖像質量良好的圖庫。任何人都可以告訴我究竟出了什麼問題,並幫助我解決這個問題?

在此先感謝。 cropped Image

Edited Image

+9

我也有過類似的問題,只是寫了雷達和禁用編輯。然後我清理了我的鍵盤:p – fzwo

+0

如果你能更詳細地瞭解解決方案,我將不勝感激。我非常需要它。 – CrazyDeveloper

+1

正如我所說的,我已經放棄了,在https://bugreport.apple.com上提交了一個錯誤報告(在內部,蘋果bug跟蹤器被稱爲「雷達」),並且沒有它。如果我確實需要這些功能,那麼我會尋找可以複製它的開源組件,或者自己編寫它。 但我不得不承認,有些奇怪的是你沒有得到任何答案。你在網站上搜索過,看看其他人是否也有同樣的問題? – fzwo

回答

2

我找到了原因裁剪就錯在這裏的原因。由UIImagePickerControllerOriginalImage返回的圖像旋轉到-90度。所以在旋轉的圖像上裁剪會返回不正確的裁剪圖像。所以我將圖像旋轉90度然後裁剪。最後,我得到了預期的高質量裁剪圖像。下面的代碼解決了我的問題。

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

代碼旋轉圖片:

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