ios 操作图像imageOrientation的相关问题

这里要讲一个大坑。

最近在做ios端的深度学习,从视频中获取图像数据,传入深度学习模型中进行预测,但总是无结果。

将图像显示到uiimageview上看是正常的,但是在输入到模型时,旋转了90度,距离砸键盘只差一个小时的距离。

终于,在看了这篇博客之后, 茅塞顿开。原来在我输入模型之前,对image进行了像素操作,去掉了图像alpha通道,所以原本图像EXIF中的imageOrientation没有了,从3变成了0,所以就旋转了90度。

所以,从相机获取出来的图像,需要在操作之前,需要使用以下方法:

- (UIImage*)fixOrientation:(UIImage*)image
{
    if (image.imageOrientation == UIImageOrientationUp)
        return image;
    CGAffineTransform transform = CGAffineTransformIdentity;
    switch (image.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform =CGAffineTransformTranslate(transform, image.size.width, image.size.height);
            transform =CGAffineTransformRotate(transform,M_PI);
            break;
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform =CGAffineTransformTranslate(transform, image.size.width,0);
            transform =CGAffineTransformRotate(transform,M_PI_2);
            break;
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform =CGAffineTransformTranslate(transform,0, image.size.height);
            transform =CGAffineTransformRotate(transform, -M_PI_2);
            break;
        default:
            break;
            
    }
    switch (image.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform =CGAffineTransformTranslate(transform, image.size.width,0);
            transform =CGAffineTransformScale(transform, -1,1);
            break;
            
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform =CGAffineTransformTranslate(transform, image.size.height,0);
            transform =CGAffineTransformScale(transform, -1,1);
            break;
        default:
            break;
            
    }
    CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
                                             
                                             CGImageGetBitsPerComponent(image.CGImage),0,
                                             
                                             CGImageGetColorSpace(image.CGImage),
                                             
                                             CGImageGetBitmapInfo(image.CGImage));
    
    CGContextConcatCTM(ctx, transform);
    
    switch (image.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            CGContextDrawImage(ctx,CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
            break;
        default:
            CGContextDrawImage(ctx,CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
            break;
    }
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage*img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}

其实我发现,好像除了初始为UIImageOrientationUp的image,在操作钱 都需要调用该函数,防止旋转90度。

 

最后讲一点感想,这两天都在搞这个问题,本来是已经用opencv搞定了,但是为了纯粹,还是想把这个问题搞明白,所以今天搞了一天。但是大部分时间做了一下无用功,应该及时查阅资料,这样可以快点解决问题。以此为鉴。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值