iOS:从叠加的UIImagePickerController相机中截取静止图像

我是iOS的新手,在过去的一周中,我一直在抨击这个问题,在网上寻找教程,例如: 处理Exif图像 , 调整图像大小 ,以及在StackOverflow上更多的随机问题。 从这些,我认为>=iOS 4.0 ,所有从相机拍摄的图像包含基于EXIF的旋转信息。

什么是不工作的:在尝试不同的图像裁剪技术后,我最终都是在一些随机的angular落裁剪图像,而且最终的图像似乎放大:(当我使用从互联网上的png图像不包含EXIF数据),裁剪正在工作,我的意思是,随机的angular落 – 图像最终在右上angular/左上angular裁剪,放大。

我正在努力实现的是:
我正在尝试从顶部100 px和底部100 px的图像。 本质上,我使用两个覆盖条 – 顶部1和底部1与CGRect(0.0, 0.0, SCREEN_WIDTH, 100.0) [一个100.0 px高长条在顶部]和另一个CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0) [在底部的另一个CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0)高的条带]。 我需要得到这两个带之间的图像:我假设图像的高度是: SCREEN_HEIGHT - 200.0

用overlay显示UIImagePickerController相机:

//SCREEN_HEIGHT = 480 and SCREEN_WIDTH = 320 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) { NSLog(@"Camera not available"); return; } imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.delegate = self; imagePicker.allowsEditing = NO; // Hide the controls imagePicker.showsCameraControls = NO; imagePicker.navigationBarHidden = YES; // Make camera view full screen imagePicker.wantsFullScreenLayout = YES; //imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y); //Overlay //OverlayView is a plain UIView with the CGRects mentioned in the question. OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; [overlay initOverlay:self]; imagePicker.cameraOverlayView = overlay; [self presentModalViewController:imagePicker animated:YES];
//SCREEN_HEIGHT = 480 and SCREEN_WIDTH = 320 UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) { NSLog(@"Camera not available"); return; } imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.delegate = self; imagePicker.allowsEditing = NO; // Hide the controls imagePicker.showsCameraControls = NO; imagePicker.navigationBarHidden = YES; // Make camera view full screen imagePicker.wantsFullScreenLayout = YES; //imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y); //Overlay //OverlayView is a plain UIView with the CGRects mentioned in the question. OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; [overlay initOverlay:self]; imagePicker.cameraOverlayView = overlay; [self presentModalViewController:imagePicker animated:YES]; 

旋转基于EXIF imageOrientation属性的图像的代码并对其进行裁剪

- (UIImage *) cropImage: (UIImage *) originalImage { CGRect cropRect = CGRectMake(0, 100.0, SCREEN_WIDTH, SCREEN_HEIGHT - 100); CGRect transformedRect = [self TransformCGRectForUIImageOrientation:cropRect :originalImage.imageOrientation :originalImage.size]; CGImageRef resultImageRef = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect); UIImage *newImage = [[[UIImage alloc] initWithCGImage:resultImageRef scale:1.0 orientation:originalImage.imageOrientation] autorelease]; return newImage; } - (CGRect) TransformCGRectForUIImageOrientation: (CGRect) source: (UIImageOrientation) orientation: (CGSize) imageSize { switch (orientation) { case UIImageOrientationLeft: { // EXIF #8 CGAffineTransform txTranslate = CGAffineTransformMakeTranslation( imageSize.height, 0.0); CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, M_PI_2); return CGRectApplyAffineTransform(source, txCompound); } case UIImageOrientationDown: { // EXIF #3 CGAffineTransform txTranslate = CGAffineTransformMakeTranslation( imageSize.width, imageSize.height); CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, M_PI); return CGRectApplyAffineTransform(source, txCompound); } case UIImageOrientationRight: { // EXIF #6 CGAffineTransform txTranslate = CGAffineTransformMakeTranslation( 0.0, imageSize.width); CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, M_PI + M_PI_2); return CGRectApplyAffineTransform(source, txCompound); } case UIImageOrientationUp: // EXIF #1 - do nothing default: // EXIF 2,4,5,7 - ignore return source; }
- (UIImage *) cropImage: (UIImage *) originalImage { CGRect cropRect = CGRectMake(0, 100.0, SCREEN_WIDTH, SCREEN_HEIGHT - 100); CGRect transformedRect = [self TransformCGRectForUIImageOrientation:cropRect :originalImage.imageOrientation :originalImage.size]; CGImageRef resultImageRef = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect); UIImage *newImage = [[[UIImage alloc] initWithCGImage:resultImageRef scale:1.0 orientation:originalImage.imageOrientation] autorelease]; return newImage; } - (CGRect) TransformCGRectForUIImageOrientation: (CGRect) source: (UIImageOrientation) orientation: (CGSize) imageSize { switch (orientation) { case UIImageOrientationLeft: { // EXIF #8 CGAffineTransform txTranslate = CGAffineTransformMakeTranslation( imageSize.height, 0.0); CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, M_PI_2); return CGRectApplyAffineTransform(source, txCompound); } case UIImageOrientationDown: { // EXIF #3 CGAffineTransform txTranslate = CGAffineTransformMakeTranslation( imageSize.width, imageSize.height); CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, M_PI); return CGRectApplyAffineTransform(source, txCompound); } case UIImageOrientationRight: { // EXIF #6 CGAffineTransform txTranslate = CGAffineTransformMakeTranslation( 0.0, imageSize.width); CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate, M_PI + M_PI_2); return CGRectApplyAffineTransform(source, txCompound); } case UIImageOrientationUp: // EXIF #1 - do nothing default: // EXIF 2,4,5,7 - ignore return source; } 

cropImage方法似乎适用于从互联网下载的图像(不包含任何方向信息)。 我没有select。 有人可以帮我吗?

谢谢阅读!

如果可以,使用Core Graphics跳过绘制图像更容易:

 - (UIImage *)cropImage:(UIImage *)oldImage { CGSize imageSize = oldImage.size UIGraphicsBeginImageContextWithOptions( CGSizeMake( imageSize.width, imageSize.height - 200), NO, 0.); [oldImage drawAtPoint:CGPointMake( 0, -100) blendMode:kCGBlendModeCopy alpha:1.]; UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return croppedImage; }