Sag*_*kar 7 iphone crop image-processing ios
我是iOS的新手,过去一周在网上寻找教程,例如:处理Exif图像,调整图像大小以及StackOverflow上的更多随机问题,我一直在抨击iOS .从这些,我想,>=iOS 4.0从相机拍摄的所有图像都包含EXIF基于旋转的信息.
什么不起作用:在尝试不同的图像裁剪技术之后,我最终得到的是在一些随机角落处裁剪图像,并且所得到的图像似乎被放大:(当我使用png来自互联网的图像时(其中)包含EXIF数据),裁剪工作正常.通过随机角落,我的意思是 - 图像最终被裁剪在右上角/左上角并放大.
我想要实现的目标:
我正在尝试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)[ 100 px底部另一个高条].我需要在这两个条带之间获取图像:我假设图像的高度为:SCREEN_HEIGHT - 200.0.
显示带覆盖的摄像头的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];
代码根据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;
}
该cropImage方法似乎适用于从互联网下载的图像(不包含任何方向信息).我的选项已经用完了.有人可以帮帮我吗?
谢谢阅读!
Mat*_*ats 17
如果可以,使用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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10747 次 |
| 最近记录: |