美文网首页
UIImage 图片剪裁 方向

UIImage 图片剪裁 方向

作者: 一位不愿透露姓名的劉公子 | 来源:发表于2018-09-30 14:16 被阅读0次

UIImage 有一个 imageOrientation 的属性,使用相机拍摄的图片会有该属性信息。
此时如果直接对 image 进行 CGImageCreateWithImageInRect 这样的剪裁操作,剪裁过的图片会丢失 imageOrientation。得到的图片看起来就会是旋转过的。

所以需要在编辑前将 image 调整好方向,再进行编辑。

为UIImage 添加一个 fixOrientation 这样的 Category。在进行编辑前,对原始图像进行 fixOrientation 的操作即可。

- (UIImage *)fixOrientation:(UIImage *)aImage {
    
    // No-op if the orientation is already correct
    if (aImage.imageOrientation == UIImageOrientationUp)
        return aImage;
    
    // We need to calculate the proper transformation to make the image upright.
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
            
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;
            
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        default:
            break;
    }
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
            
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        default:
            break;
    }
    
    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
                                             CGImageGetBitsPerComponent(aImage.CGImage), 0,
                                             CGImageGetColorSpace(aImage.CGImage),
                                             CGImageGetBitmapInfo(aImage.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (aImage.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
            break;
            
        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
            break;
    }
    
    // And now we just create a new UIImage from the drawing context
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}

相关文章

  • UIImage 图片剪裁 方向

    UIImage 有一个 imageOrientation 的属性,使用相机拍摄的图片会有该属性信息。此时如果直接对...

  • UIImage剪裁、压缩、拉伸等处理

    1. 图片剪裁方法 直接调用如下系统现成的图片剪裁方法,封装成- (UIImage *)imageByCropTo...

  • UIImage 分类大集合

    UIImage 分类大集合 @(iOS)[UIImage] [TOC] 修正图片方向 这个使用很常见,特别是在上传...

  • 剪裁框和图片剪裁

    图片处理中经常用的图片剪裁,就是通过剪裁框确定图片剪裁的区域,然后剪去该区域的图片,今天实现了一下,其实图片剪裁本...

  • UIImage pngData 写入缓存后方向改变

    Swift 使用UIImage 的pngData 写入缓存后,图片方向会改变。 解决: 暂时使用jpegData方法。

  • 图片剪裁

    做项目是经常会遇见需要对图片进行剪裁的情况,下面来点干货 是不是很简单啊,end。。。。

  • 剪裁图片

    -(UIImage *)imageWithImage:(UIImage *)image sizeScaletoSi...

  • 图片剪裁

    图片剪裁

  • 2018-06-27

    Swift 图片转换 压缩 PNG图片转UIImage let image = UIImage(named :"...

  • iOS UIslider setMinimumTrackImag

    UIImage *minTrack = [[[UIImage imageNamed:@"图片"] imageWit...

网友评论

      本文标题:UIImage 图片剪裁 方向

      本文链接:https://www.haomeiwen.com/subject/ewrwoftx.html