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