ios - 在保存到文件之前旋转图像/上下文

标签 ios rotation uiimage transform cgcontext

如何旋转我的上下文?

我已经尝试了我能想到的所有与 CGAffineTransformRotate()CGContextRotateCTM() 的组合,但无法使其工作。

下面的代码效果很好。它捕获各种尺寸的图像及其背景,以便它们始终为 320x480 或 480x320。这很重要。但是,我希望水平图像在保存到文件之前旋转 90 度。

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(480, 320), NO, 0.0);
    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 480, 320)];           
    UIImage *im = [UIImage imageWithContentsOfFile:[allImagePaths objectAtIndex:currImg]];
    iv.image = im;
    iv.backgroundColor = [UIColor blackColor];
    iv.contentMode = UIViewContentModeScaleAspectFit;               
    CGContextRef context = UIGraphicsGetCurrentContext();       
    [iv.layer renderInContext:context];
        //
        // how to rotate it around here?
        //
    UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
    NSData* imageData = UIImageJPEGRepresentation(capturedImage, 1.0);
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    [imageData writeToFile:[docDir stringByAppendingPathComponent:@"result.jpg"] atomically:NO]; 
    UIGraphicsEndImageContext();

每当我添加任何类型的旋转时,它都会出现问题(白色结果图像或屏幕上只有一半图像并且不旋转)。

任何有关此示例的帮助都会很好。

最佳答案

使用此分类方法来获取灵感。这不会完全满足您的要求,但想法是相同的。

- (UIImage *)fixOrientation 
{   
    // No-op if the orientation is already correct
    if (self.imageOrientation == UIImageOrientationUp) return self;

    // 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 (self.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;

        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, self.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
    }

    switch (self.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;

        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                             CGImageGetBitsPerComponent(self.CGImage), 0,
                                             CGImageGetColorSpace(self.CGImage),
                                             CGImageGetBitmapInfo(self.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (self.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
            break;

        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.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;
}

关于ios - 在保存到文件之前旋转图像/上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6413851/

相关文章:

ios - 使用 UIRectFill 填充单元格的一部分

Swift:刷新 UIImageView 图像

ios - 如何从iOS中旋转,缩放和倒置的UIImageView中提取UIImage

IOS UIImageView 显示为黑色背景

ios - 从设备到设备的 Firebase Google Cloud 消息传递

Android:旋转大图像崩溃而不会抛出错误

c - C中的旋转程序

swift - 无法使用 UIKit 在 Swift Package Manager XCAssets 中显示图像

ios - 通过 segue 将 NSString 值分配给 UI 标签文本

c++ - 如何在 OpenCV 中获取旋转矩形的顶点?