2013-10-07 3 views
4

Я вращающаяся UIImageView с помощью этого:UIImageView: трансформируются UIImage

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
myImgView.transform = CGAffineTransformMakeRotation(angle*M_PI/180); 
[UIView commitAnimations]; 

Теперь я хочу, чтобы получить развернутое изображение. Я могу сделать это? Я пытался сделать это с помощью CoreGraphics, используя функцию CGImageRotatedByAngle из принятого ответа для this question, но он преобразует неверные координаты (окончательно мы получим третий снимок экрана, отмеченный как неверный). Как вы можете видеть, изображение теряет свой первоначальный размер и обрезается. Моя цель - получить изображение, как на центральном снимке с оригинальным размером и повернутым для заданного угла. Я имею в виду, что размер вращающейся фигуры остается неизменным, но новый образ, конечно, будет больше первоначального.

enter image description here

ответ

8

ОК, я снова отвечая на мой собственный вопрос, надеюсь, это будет полезно для кого-то в будущем ... Возвращаясь к CGImageRotatedByAngle как я уже сказал, что это дает почти необходимый эффект, но координировать перевод системы последовательность должна быть слегка изменена. И вот так я получил желаемый результат:

- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle { 

    CGFloat angleInRadians = angle * (M_PI/180); 
    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat 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); 
    CGContextSetAllowsAntialiasing(bmContext, YES); 
    CGContextSetShouldAntialias(bmContext, YES); 
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh); 
    CGColorSpaceRelease(colorSpace); 
    CGContextTranslateCTM(bmContext, 0.5f * rotatedRect.size.width, 0.5f * rotatedRect.size.height) ; 
    CGContextRotateCTM(bmContext, angleInRadians); 
    CGContextDrawImage(bmContext, CGRectMake(-imgRect.size.width* 0.5f, -imgRect.size.height * 0.5f, 
              imgRect.size.width, 
              imgRect.size.height), 
         imgRef); 
    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); 
    CFRelease(bmContext); 
    [(id)rotatedImage autorelease]; 

    return rotatedImage; 
} 
+3

Не чувствовать себя плохо, отвечая на свой вопрос. Не стесняйтесь идти дальше и принимайте ответ, если он дает точный, релевантный ответ на вопрос. См. [Этот wiki post] (http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question) –

0

это работает для меня, и другой способ решения

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
{ 
    CGRect imgRect = CGRectMake(0, 0, self.size.width, self.size.height); 
    CGAffineTransform transform = CGAffineTransformMakeRotation(DegreesToRadians(degrees)); 
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); 
    CGSize rotatedSize = rotatedRect.size; 

    // Create the bitmap context 
    UIGraphicsBeginImageContext(rotatedRect.size); 
    CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

    // Move the origin to the middle of the image so we will rotate and scale around the center. 
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); 

    // Rotate the image context 
    CGContextRotateCTM(bitmap, DegreesToRadians(degrees)); 

    // Now, draw the rotated/scaled image into the context 
    CGContextScaleCTM(bitmap, 1.0, -1.0); 
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width/2, -self.size.height/2, self.size.width, self.size.height), [self CGImage]); 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 
Смежные вопросы