【问题标题】:Rotate image/context before saving to file在保存到文件之前旋转图像/上下文
【发布时间】:2011-09-18 19:44:08
【问题描述】:

如何旋转上下文?

我已经尝试了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();

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

对这个例子的任何帮助都会很好。

【问题讨论】:

    标签: ios rotation uiimage transform cgcontext


    【解决方案1】:

    回答我自己的问题很糟糕,但很好......

    似乎主要问题是坐标系。默认情况下,使用 CGContextRotateCTM() 旋转会围绕 (0,0) 点进行旋转。表示图像“隐藏”在视野之外。我必须这样做[image drawInRect:CGRectMake(0,-320,480,320)];

    我还必须使用 2 个上下文。第一个水平捕捉带背景的水平图像。第二个垂直保存旋转的垂直图像。

    【讨论】:

      【解决方案2】:

      使用这种分类方法来获得灵感。这不会完全符合您的要求,但想法是一样的。

      - (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;
      }
      

      【讨论】:

      • 无法使其与转换一起使用。也许只是不知道如何在我的示例中使用它。
      • Thanx hundreth,我刚刚在基于 UIImage 方向搜索旋转时遇到了这个链接,它对我有用..thanx 很多..你节省了我的时间..
      【解决方案3】:

      试试这个,尚未测试:

        CGSize size = imageIsHorizontal ? CGSizeMake(480, 320) : CGSizeMake(320, 480);
        UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextRotateCTM(context, 90 * M_PI / 180);
        [image drawInRect:(CGRect){CGPointZero, size}];
        UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        NSData* imageData = UIImageJPEGRepresentation(capturedImage, 1.0);
        NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        [imageData writeToFile:[docDir stringByAppendingPathComponent:@"result.jpg"] atomically:NO]; 
      

      【讨论】:

      • 如果“图像”是我的文件中的图像,那么它不起作用。白色且未旋转的结果文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2018-09-03
      • 1970-01-01
      相关资源
      最近更新 更多