您的位置:首页 > 移动开发 > IOS开发

iOS开发 关于照片截取内容旋转的问题

2013-08-13 18:09 429 查看
在iOS开发中,遇到一个比较怪的问题,对读取出来的照片进行截取部分时。

使用的截取方法是比较常见的:

CGImageRef imageRef=CGImageCreateWithImageInRect([image CGImage],rect);
    UIImage *newImage=[UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);


但是实际使用中,发现在截取相机拍摄的图片时,有时候截取的部分不是我们所指定的区域,截取出来的部分似乎是图片被旋转后再截取出来的。

这个问题比较奇怪,通过仔细的对比排查,我发现原来图片其实有一个一直以来基本被忽略的属性:

@property(nonatomic,readonly) UIImageOrientation imageOrientation;
这个属性标记了图片的方向,而在实际使用时,通常我们使用UIImageView做图片显示时,并不用关心这个图片的方向,因为UIImageView继承自UIView的属性:

@property(nonatomic) CGAffineTransform transform;
能够自动的按照图片的朝向进行显示。

那么当我们在自己做想要的照片部分截取时,就需要对照片的朝向事先做好处理。才能避免出现截取区域不是我们想要的区域问题。

我处理了一个图片截取方法,供大家参考:

+(UIImage*)imageFromImage:(UIImage*)image inRect:(CGRect)rect transform:(CGAffineTransform)transform{
    CGSize newSize=rect.size;
    UIGraphicsBeginImageContext(newSize);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, newSize.width / 2, newSize.height / 2);
    CGContextConcatCTM(context, transform);
    CGContextTranslateCTM(context, newSize.width / -2, newSize.height / -2);
    [image drawInRect:CGRectMake(-rect.origin.x, -rect.origin.y, image.size.width, image.size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}


其中的rect是相对与图片的像素尺寸(注意,不是iOS默认的点尺寸)。

其中的transform是在正常显示原图的ImageView的transform属性。比如orginImageView.transform。

好了这个分享出来,希望对大家有所帮助。

最后给出对一个照片截取的开源控件:PEPhotoCropEditor,做的比较好,大家可以去参考研究下。

转载请注明出处:来自月若无涯的博客:/article/3638005.html 欢迎指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: