代码之家  ›  专栏  ›  技术社区  ›  Andrew Johnson

如何修改这段代码(旋转CGImage),而不是在旋转时裁剪图像?

  •  1
  • Andrew Johnson  · 技术社区  · 16 年前

    将矩形放大一点似乎会扭曲正在旋转的图像。

    + (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle {
    
      float angleInRadians = angle * (M_PI / 180);
      float width = CGImageGetWidth(imgRef);
      float height = CGImageGetHeight(imgRef);
    
      CGRect imgRect = CGRectMake(0, 0, width, height);
      CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
      CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
    
      CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
      CGContextRef bmContext = CGBitmapContextCreate(NULL,
                                                     rotatedRect.size.width,
                                                     rotatedRect.size.height,
                                                     8,
                                                     0,
                                                     colorSpace,
                                                     kCGImageAlphaPremultipliedFirst);
      CGColorSpaceRelease(colorSpace);
      CGContextTranslateCTM(bmContext,
                            +(rotatedRect.size.width/2),
                            +(rotatedRect.size.height/2));
      CGContextRotateCTM(bmContext, angleInRadians);
      CGContextTranslateCTM(bmContext,
                            -(rotatedRect.size.width/2),
                            -(rotatedRect.size.height/2));
      CGContextDrawImage(bmContext, CGRectMake(0, 0,
                                               rotatedRect.size.width,
                                               rotatedRect.size.height),
                                               imgRef);
    
      CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
      CFRelease(bmContext);
      [(id)rotatedImage autorelease];
    
      return rotatedImage;
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   jstevenco    14 年前

    编写的代码不考虑源图像和目标图像大小的差异。您需要在调用CGContextDrawImage之前或调用时对此进行说明。编写的代码也不保留图像的原始纵横比——它使用目标大小和高度,而不是原始大小和高度。

    实现示例代码中OP问题答案的最简洁方法是替换该行

    
        CGContextDrawImage(bmContext, 
                           CGRectMake(0,
                                      0,
                                      rotatedRect.size.width
                                      rotatedRect.size.height), 
                           imgRef);
    
    

    具有

    
        CGContextDrawImage(bmContext, 
                           CGRectMake((rotatedRect.size.width-width)/2.,
                                      (rotatedRect.size.height-height)/2.,
                                      width,
                                      height), 
                           imgRef);
    
    
    
        2
  •  0
  •   martinr    16 年前

    我不确定我是否完全明白这一点。这些几何问题很难回答。

    但只要看看几何图形,我就会尝试:

    • 不要做第二次翻译。

    • 在矩形(-width/2,-height/2,width,height)处绘制图像。