将UIImage转换为CIImage以裁剪为CGRect。 AVFoundation

时间:2013-10-14 09:18:03

标签: ios objective-c uiimage avfoundation ciimage

所以我有一个想要裁剪的UIImage。我查看并找到了CIImage的imageByCroppingToRect方法。因此,我将数据转换为CIImage而不是UIImage,使用指定的方法裁剪它,然后将生成的CIImage转换为UIImage,然后在UIImageView中显示它。

我的代码是

 NSData *data = [[NSData alloc]initWithData:[def objectForKey:@"imageData"]];
//UIImage *normalImage = [[UIImage alloc]initWithData:data];
CIImage *originalImage = [CIImage imageWithData:data];
[originalImage imageByCroppingToRect:CGRectMake(10, 72, 300, 300)];

self.imageView.image = [UIImage imageWithCIImage:originalImage];

问题是图像旋转了90度,我不确定它是否被裁剪。使用设备的相机捕获此图像。我使用AVFoundation访问相机。我的会话预设为AVCaptureSessionPresetPhoto。我想这就是我进行缩放的原因。

2 个答案:

答案 0 :(得分:3)

CGRect rect = CGRectMake(10, 72, 300, 300);
CGImageRef imref = CGImageCreateWithImageInRect([yourOriginalImage CGImage], rect);
UIImage *newSubImage = [UIImage imageWithCGImage:imref];

试试这个。可以帮助你。

编辑:

首先修复图像方向: 参考:https://github.com/j3r3miah/mapmatic-ios/blob/master/Mapmatic/UIImage+FixOrientation.m

然后使用上面的代码将Image裁剪为指定的Rect。

答案 1 :(得分:1)

不是你的问题的答案,而是问题的答案

https://github.com/mbcharbonneau/UIImage-Categories

特别是此文件:https://github.com/mbcharbonneau/UIImage-Categories/blob/master/UIImage%2BResize.m

- (UIImage *)croppedImage:(CGRect)bounds {
    CGFloat scale = MAX(self.scale, 1.0f);
    CGRect scaledBounds = CGRectMake(bounds.origin.x * scale, bounds.origin.y * scale, bounds.size.width * scale, bounds.size.height * scale);
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], scaledBounds);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:UIImageOrientationUp];
    CGImageRelease(imageRef);
    return croppedImage;
}

您将找到裁剪图像所需的一切