相机图像方向

DNe*_*ell 5 uiimage nsdata ios

在我的应用程序中,我正在使用相机捕获图像.它们作为NSData表示存储在NSArray中.当我将NSData转换回图像时,当我拍摄时,方向现在是横向而不是纵向.

    NSData *data = UIImagePNGRepresentation([arrayImage objectAtIndex:0]);
    UIImage *tmp = [UIImage imageWithData:data];
Run Code Online (Sandbox Code Playgroud)

有人有解释吗?谢谢.

suv*_*san 15

您应该修改代码所遵循的摄像机捕获的图像方向,默认情况下摄像机图像的方向不正确

- (UIImage *)fixrotation:(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;
        case UIImageOrientationUp:
        case UIImageOrientationUpMirrored:
            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;
        case UIImageOrientationUp:
        case UIImageOrientationDown:
        case UIImageOrientationLeft:
        case UIImageOrientationRight:
            break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    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:
            // Grr...
            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;
    }

    // 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;
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*rci 2

-[UIImage imageOrientation]可能有帮助:)

\n\n
\n

图像方向影响绘制时图像数据的显示方式。默认情况下,图像以 \xe2\x80\x9cup\xe2\x80\x9d 方向显示。但是,如果图像具有关联的元数据(例如 EXIF 信息),则此属性包含该元数据指示的方向。有关此属性的可能值的列表,请参阅 \xe2\x80\x9cUIImageOrientation。\xe2\x80\x9d

\n
\n\n

由于该属性是只读的,并且根据您想要执行的操作,可能的(但丑陋的)解决方案可能是:

\n\n
UIImage *sourceImage = [arrayImage objectAtIndex:0];\nNSData *data = UIImagePNGRepresentation(sourceImage);\nUIImage *tmp = [UIImage imageWithData:data];\nUIImage *fixed = [UIImage imageWithCGImage:tmp.CGImage\n                                     scale:sourceImage.scale\n                               orientation:sourceImage.imageOrientation];\n
Run Code Online (Sandbox Code Playgroud)\n\n

(未经测试,可能/必须有更干净的东西)

\n\n

编辑:第一部分是对你问题的回答,更多的是解释而不是修复。

\n\n

这个这个 (旧的?)博客文章可能对您来说是有趣的读物。奇怪的是,当我使用UIImageJPEGRepresentation将图像发送到服务器时,我从未遇到过这个问题...您正在使用什么 iOS 版本?这可能是一个旧的 SDK 错误?

\n