Как я могу изменить этот код, который вращает CGImage, чтобы не обрезать изображение при повороте? - PullRequest
1 голос
/ 13 января 2010

Эта функция поворачивает CGImage на произвольное число градусов, но немного обрезает изображение. Как я могу избежать отсечения?

Увеличение размера прямоугольника может привести к искажению изображения при повороте.

+ (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 ]

1 голос
/ 19 октября 2011

В написанном коде не учитывается разница в размерах исходного и конечного изображений. Вы должны учитывать это до или при вызове CGContextDrawImage. Написанный код также не сохраняет исходное соотношение сторон изображения - он использует целевой размер и высоту, а не исходный.

Самый краткий способ получить ответ на вопрос ОП в примере кода - заменить строку


    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);


0 голосов
/ 13 января 2010

Не уверен, что я полностью понял это. Эти вопросы геометрии являются сложными.

Но просто глядя на геометрию, я бы попробовал:

  • Округление повернутой ширины и высоты до ближайшего пикселя.

  • Не делайте второй перевод.

  • Проверьте знак первого перевода и первый и второй угол поворота.

  • Нанесите изображение на прямоугольник (-width / 2, -height / 2, ширина, высота).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...