现在的位置: 首页 > 综合 > 正文

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

2018年01月25日 ⁄ 综合 ⁄ 共 1424字 ⁄ 字号 评论关闭

在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,做的比较好,大家可以去参考研究下。

转载请注明出处:来自月若无涯的博客:http://blog.csdn.net/u010124617/article/details/9952275  欢迎指正

抱歉!评论已关闭.