web-gelistirme-sc.com

İOS'ta bir görüntü nasıl 90 derece döndürülür?

Yapmak istediğim, kameramdan bir anlık görüntü almak, onu bir sunucuya göndermek ve ardından sunucu bana görüntüyü bir viewController'da geri göndermektir. Görüntü portre modundaysa, görüntü ekranda iyi görünür, ancak görüntü yatay moddaysa görüntü ekranda gerilmiş görünür (portre modunda görünmeye çalışır!). Bunu nasıl çözeceğimi bilmiyorum ama sanırım bir resmin ilk önce dikey/yatay modda olup olmadığını kontrol etmek ve sonra yatay modda olup olmadığını kontrol etmek için sanırım ekranda göstermeden önce 90 derece döndürün .. yap bunu?

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

Swift 4:

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

Bu, görüntünün herhangi bir dereceye kadar döndürülmesinin tam kodudur, sadece görüntü işlemeyi kullanmak istediğiniz yerde, örneğin .m'deki uygun dosyaya ekleyin.

form

@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

Bu kod parçacığını Apple's SquareCam example şeklinde gösterir.

Yukarıdaki yöntemi çağırmak için sadece aşağıdaki kodu kullanın

UIImage *rotatedSquareImage = [square imageRotatedByDegrees:rotationDegrees];

Burada square bir UIImage ve rotationDegrees, görüntüyü o derece döndüren bir flote ivar

28
The iOSDev

Swift 3 ve Swift 4 yerine .pi kullanıyor

Örneğin:

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

}
11
janusfidel

Bu kodu resme eklemeniz yeterlidir.

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

Bunu çalışırken XCode 6.3 Swift 1.2'de bir hatayla karşılaştım

self.imageview.transform = CGAffineTransformMakeRotation(M_PI_2);

Bunu cast tipini düzeltmek için denemelisin:

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

Swift 3 versiyonu:

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

Swift 4 | Xcode 9 sözdizimi (lütfen bu kodun bir UIImage değil, saat yönünde bir UIImageView'ü 90 derece döndürdüğünü unutmayın):

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

Swift 4+.

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

Not: açı raddian ise

.pi = 180 derece 

.pi/2 = 90 derece

Animasyon eklemek isterseniz 

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

        }
        })
    }

Çıktı:

 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

}

İşlev kullanımı

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

İOSDev yanıtının Swift 2.2 sürümü (UIImage uzantısında):

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

En iyisi sadece bitmap'i kullanmak. Benim durumumda reference.image içinde bir UIImage kullanın ve ben base64String de görüntüyü dönüştürdüm. CGAffineTransformMakeRotation olmadan ve döndürülmüş ViewBox.transform olmadan

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