web-dev-qa-db-ja.com

iOSで画像を90度回転する方法は?

私がやりたいのは、カメラからスナップショットを撮り、それをサーバーに送信してから、サーバーがviewControllerで画像を送り返すことです。画像がポートレートモードの場合、画像は画面上に適切に表示されますが、画像がランドスケープモードで撮影された場合、画像は画面上に伸びて表示されます(ポートレートモードで表示しようとするため)!私はこれを修正する方法がわかりませんが、1つの解決策は最初に画像がポートレート/ランドスケープモードになっているかどうかを確認し、次にランドスケープモードになっている場合は画面に表示する前に90度回転させます。どうすればそれができますか?

41
user1511244
self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

Swift 4:

self.imageview.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))
114
mandeep-dhiman

これは、画像を任意の角度で回転させるための完全なコードです。適切なファイルに追加するだけです。つまり、画像処理を使用したい場所の.m

。m

@interface UIImage (RotationMethods)
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
@end

@implementation UIImage (RotationMethods)

static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees 
{   
    // calculate the size of the rotated view's containing box for our drawing space
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize);
    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;

}

@end

これはAppleの SquareCam の例のコードスニペットです。

上記のメソッドを呼び出すには、以下のコードを使用します

UIImage *rotatedSquareImage = [square imageRotatedByDegrees:rotationDegrees];

ここで、squareは1つのUIImageであり、rotationDegreesは画像を回転させるflote ivar

28
The iOSDev

Swift 3およびSwift 4は代わりに.piを使用します

例えば:

//rotate 90 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi / 2)

//rotate 180 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi)

//rotate 270 degrees
myImageView.transform = CGAffineTransform(rotationAngle: .pi * 1.5)
14
Jesus Rodriguez
- (UIImage *)rotateImage:(UIImage*)image byDegree:(CGFloat)degrees 
{   
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,image.size.width, image.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;
    [rotatedViewBox release];

    UIGraphicsBeginImageContext(rotatedSize);
    CGContextRef bitmap = UIGraphicsGetCurrentContext();


    CGContextTranslateCTM(bitmap, rotatedSize.width, rotatedSize.height);

    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));


    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-image.size.width, -image.size.height, image.size.width, image.size.height), [image CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
12
janusfidel

このコードを画像に追加するだけです。

Image.transform=CGAffineTransformMakeRotation(M_PI / 2);
8
IronManGill

XCode 6.3でこれをしようとするとエラーが発生しましたSwift 1.2

self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

型キャストの修正を強制するには、これを試してください:

self.imageview.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2));
6
mattyU

Swift 3バージョン:

imageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
3
Dhruv Khatri

Swift 4 | Xcode 9構文(このコードはUIImageではなく、UIImageViewを時計回りに90度回転させることに注意してください):

myImageView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
2
xscoder

Swift 4 +。

arrowImageView.transform = CGAffineTransform(rotationAngle: .pi/2)

注:角度はラジアン単位

.pi = 180度

.pi/2 = 90度

アニメーションを追加する場合

  @IBAction func applyTransForm(sender: UIButton) {
        sender.isSelected = !sender.isSelected
        UIView.animate(withDuration: 1, animations: {
        if sender.isSelected {
            self.arrowImageView.transform = CGAffineTransform(rotationAngle: .pi)
        } else {
            self.arrowImageView.transform = CGAffineTransform(rotationAngle: 0)

        }
        })
    }

出力:

enter image description here

2
Jack
 func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {

    let size = oldImage.size
    UIGraphicsBeginImageContext(size)

    let bitmap: CGContext = UIGraphicsGetCurrentContext()!
    //Move the Origin to the middle of the image so we will rotate and scale around the center.
    bitmap.translateBy(x: size.width / 2, y: size.height / 2)
    //Rotate the image context
    bitmap.rotate(by: (degrees * CGFloat(Double.pi / 180)))
    //Now, draw the rotated/scaled image into the context
    bitmap.scaleBy(x: 1.0, y: -1.0)

    let Origin = CGPoint(x: -size.width / 2, y: -size.width / 2)

    bitmap.draw(oldImage.cgImage!, in: CGRect(Origin: Origin, size: size))

    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage

}

機能の使用

imageRotatedByDegrees(oldImage: yourImage, deg: degree) 
1
urvashi bhagat

Swift 2.2 iOSDevアンサーのバージョン(UIImage拡張機能内):

func degreesToRadians(degrees: CGFloat) -> CGFloat {
    return degrees * CGFloat(M_PI) / 180
}

func imageRotatedByDegrees(degrees: CGFloat) -> UIImage {
    // calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRectMake(0,0,self.size.width, self.size.height))
    let t = CGAffineTransformMakeRotation(self.degreesToRadians(degrees))
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let 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);

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

    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}
0
Beninho85

ビットマップのみを使用するのが最適です。私の場合、reference.imageにあるUIImageを使用し、base64Stringで画像を変換しました。 CGAffineTransformMakeRotationなし、rotatedViewBox.transformなし

var rotatedSize = reference.image.size;
                //Create bitmap context
                UIGraphicsBeginImageContext(rotatedSize);
                var bitmap = UIGraphicsGetCurrentContext();
                //move Origin to the middle of the image for rotation
                CGContextTranslateCTM(bitmap, rotatedSize.width / 2, rotatedSize.height / 2);
                //rotate image context
                CGContextRotateCTM(bitmap, 1.5708);
                CGContextDrawImage(bitmap, CGRectMake(-reference.image.size.width / 2, -reference.image.size.height / 2, reference.image.size.width, reference.image.size.height), reference.image.CGImage);
                var rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
                var base64Image = UIImageJPEGRepresentation(rotatedImage, compression).base64EncodedStringWithOptions(0);
                UIGraphicsEndImageContext();
                return base64Image;
0
Luis Ortiz