4

私はこれを使用して UIImageView を回転させています:

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

今、回転した画像を取得したい。これはできますか?この質問に対する受け入れられた回答から CGImageRotatedByAngle 関数を使用して CoreGraphics で作成しようとしていましたが、座標がわずかに正しく変換されません (最後に、3 番目のスクリーンショットが間違っているとマークされます)。ご覧のとおり、画像は元のサイズを失い、トリミングされています。私の目標は、元のサイズで中央のショットのような画像を取得し、指定された角度で回転させることです。つまり、回転した形状のサイズは変更しない必要がありますが、もちろん新しい画像は最初よりも大きくなります。

ここに画像の説明を入力

4

3 に答える 3

10

OK、私は再び自分の質問に答えています。将来誰かに役立つことを願っています...以前に言ったように 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;
}
于 2013-10-07T09:22:32.660 に答える