如何在Swift中旋转图像?

时间:2016-11-30 07:20:45

标签: ios swift animation uiview uiviewanimation

我无法将图像快速旋转90度。我写了下面的代码但是有一个错误而且没有编译

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

    //Calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: oldImage.size.width, height: oldImage.size.height))
    let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat(M_PI / 180))
    rotatedViewBox.transform = t
    let rotatedSize: CGSize = rotatedViewBox.frame.size

    //Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    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: rotatedSize.width / 2, y: rotatedSize.height / 2)

    //Rotate the image context
    bitmap.rotate(by: (degrees * CGFloat(M_PI / 180)))

    //Now, draw the rotated/scaled image into the context
    bitmap.scaleBy(x: 1.0, y: -1.0)
    bitmap.draw(oldImage, in:  CGRect(origin: (x: -oldImage.size.width / 2,  y: -oldImage.size.height / 2, width:  oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))

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

    return newImage

  }

下面是我不确定的代码

bitmap.draw(oldImage, in:  CGRect(origin: (x: -oldImage.size.width / 2,  y: -oldImage.size.height / 2, width:  oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))

13 个答案:

答案 0 :(得分:52)

设置ImageView图像

ImageView.transform = ImageView.transform.rotated(by: CGFloat(M_PI_2))

答案 1 :(得分:18)

<dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>2.22</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-jetty-http</artifactId>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
        </dependency>

答案 2 :(得分:12)

在一行中:

   CREATE TABLE #Source 
    (
    ID varchar(50), nameFull varchar(50), salutation varchar(50), nameFirst varchar(50), nameLast varchar(50), addressLine1 varchar(50), 
    addressLine2 varchar(50), addressCity varchar(50), addressState varchar(50), addressZip varchar(50), 
    phone1full varchar(50), phone2full varchar(50), phone3full varchar(50), phone4full varchar(50), phone5full varchar(50), email1 varchar(50)
    )
    CREATE TABLE #Target
    (pov_Prospect varchar(50), 
    pov_nameFull varchar(50), pov_salutation varchar(50), pov_nameFirst varchar(50), pov_nameLast varchar(50), 
    pov_addressLine1 varchar(50), pov_addressLine2 varchar(50), pov_addressCity varchar(50), pov_addressState varchar(50), pov_addressZip varchar(50), 
    pov_phone1full varchar(50), pov_phone2full varchar(50), pov_phone3full varchar(50), pov_phone4full varchar(50), pov_phone5full varchar(50), pov_email1 varchar(50)
    )

    -- Jon
    INSERT INTO #Source (ID, nameFull, salutation, nameFirst, nameLast, addressLine1, addressLine2, addressCity, addressState, addressZip, 
    phone1full, phone2full, phone3full, phone4full, phone5full, email1)
    VALUES ('1', 'Jon Doe', 'Jon', 'Jon', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880', 
    '1112223333', NULL, '4445556666', NULL, NULL, 'jond@gmail.com');
    INSERT INTO #Target
    (pov_Prospect, pov_nameFull, pov_salutation, pov_nameFirst, pov_nameLast, 
    pov_addressLine1, pov_addressLine2, pov_addressCity, pov_addressState, pov_addressZip, 
    pov_phone1full, pov_phone2full, pov_phone3full, pov_phone4full, pov_phone5full, pov_email1)
    VALUES ('1', 'Jon Doe', 'Jon', 'Jon', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880', 
    '1112223333', '4445556666', NULL, NULL, NULL, 'jond@gmail.com');
    --Jane
    INSERT INTO #Source (ID, nameFull, salutation, nameFirst, nameLast, addressLine1, addressLine2, addressCity, addressState, addressZip, 
    phone1full, phone2full, phone3full, phone4full, phone5full, email1)
    VALUES ('2', 'Jane Smith', 'Jane', 'Jane', 'Smith', '111 East Grove', 'Suite 101', 'Denver', 'CO', '75365', 
    '8882223333', NULL, NULL, NULL, NULL, 'janes@gmail.com');
    INSERT INTO #Target (pov_Prospect, pov_nameFull, pov_salutation, pov_nameFirst, pov_nameLast, 
    pov_addressLine1, pov_addressLine2, pov_addressCity, pov_addressState, pov_addressZip, 
    pov_phone1full, pov_phone2full, pov_phone3full, pov_phone4full, pov_phone5full, pov_email1)
    VALUES ('2', 'Jane Smith', 'Jane', 'Jane', 'Smith', '111 East Grove', 'Suite 101', 'Denver', 'CO', '75365', 
    '8882223333', NULL, NULL, NULL, NULL, 'janeR@gmail.com');
    --Bob - added after the fact...I didn't know there were so many like Bob
    INSERT INTO #Source (ID, nameFull, salutation, nameFirst, nameLast, addressLine1, addressLine2, addressCity, addressState, addressZip, 
    phone1full, phone2full, phone3full, phone4full, phone5full, email1)
    VALUES ('3', 'Bob Doe', 'Bob', 'Bob', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880', 
    '111', NULL, '111', NULL, NULL, 'Bobd@gmail.com');
    INSERT INTO #Target
    (pov_Prospect, pov_nameFull, pov_salutation, pov_nameFirst, pov_nameLast, 
    pov_addressLine1, pov_addressLine2, pov_addressCity, pov_addressState, pov_addressZip, 
    pov_phone1full, pov_phone2full, pov_phone3full, pov_phone4full, pov_phone5full, pov_email1)
    VALUES ('3', 'Bob Doe', 'Bob', 'Bob', 'Doe', '1234 West Elm', NULL, 'Chicago', 'IL', '45880', 
    '111', NULL, NULL, NULL, NULL, 'Bobd@gmail.com');

------------------------------------------------------------------------------------------------------------------------------------------------------------------

      ;with data as (
    SELECT
            s.id, 
            ISNULL(s.nameFull, '') nameFull , 
            ISNULL(s.salutation, '') salutation , 
            ISNULL(s.nameFirst, '') nameFirst , 
            ISNULL(s.nameLast, '') nameLast , 
            ISNULL(s.addressLine1, '') addressLine1 , 
            ISNULL(s.addressLine2, '') addressLine2 , 
            ISNULL(s.addressCity, '') addressCity , 
            ISNULL(s.addressState, '') addressState , 
            ISNULL(s.addressZip, '') addressZip , 
            ISNULL(s.phone1full, '') phone1full , 
            ISNULL(s.phone2full, '') phone2full , 
            ISNULL(s.phone3full, '') phone3full , 
            ISNULL(s.phone4full, '') phone4full , 
            ISNULL(s.phone5full, '') phone5full , 
            ISNULL(s.email1, '') email1 ,
            ISNULL(t.pov_nameFull, '') pov_nameFull , 
            ISNULL(t.pov_salutation, '') pov_salutation , 
            ISNULL(t.pov_nameFirst, '') pov_nameFirst , 
            ISNULL(t.pov_nameLast, '') pov_nameLast , 
            ISNULL(t.pov_addressLine1, '') pov_addressLine1 , 
            ISNULL(t.pov_addressLine2, '') pov_addressLine2 , 
            ISNULL(t.pov_addressCity, '') pov_addressCity , 
            ISNULL(t.pov_addressState, '') pov_addressState , 
            ISNULL(t.pov_addressZip, '') pov_addressZip , 
            ISNULL(t.pov_phone1full, '') pov_phone1full , 
            ISNULL(t.pov_phone2full, '') pov_phone2full , 
            ISNULL(t.pov_phone3full, '') pov_phone3full , 
            ISNULL(t.pov_phone4full, '') pov_phone4full , 
            ISNULL(t.pov_phone5full, '') pov_phone5full , 
            ISNULL(t.pov_email1, '') pov_email1 


    FROM [#Source] [S]
        INNER JOIN [#Target] [T]
        ON [S].[ID] = [T].[pov_Prospect]
    WHERE
              ISNULL( s.nameFull, '') <> ISNULL( t.pov_nameFull, '') OR 
          ISNULL( s.salutation, '') <> ISNULL( t.pov_salutation, '') OR 
          ISNULL( s.nameFirst, '') <> ISNULL( t.pov_nameFirst, '') OR 
          ISNULL( s.nameLast, '') <> ISNULL( t.pov_nameLast, '') OR 
          ISNULL( s.addressLine1, '') <> ISNULL( t.pov_addressLine1, '') OR 
          ISNULL( s.addressLine2, '') <> ISNULL( t.pov_addressLine2, '') OR 
          ISNULL( s.addressCity, '') <> ISNULL( t.pov_addressCity, '') OR 
          ISNULL( s.addressState, '') <> ISNULL( t.pov_addressState, '') OR 
          ISNULL( s.addressZip, '') <> ISNULL( t.pov_addressZip, '') OR 
          ISNULL( s.phone1full, '') <> ISNULL( t.pov_phone1full, '') OR 
          ISNULL( s.phone2full, '') <> ISNULL( t.pov_phone2full, '') OR 
          ISNULL( s.phone3full, '') <> ISNULL( t.pov_phone3full, '') OR 
          ISNULL( s.phone4full, '') <> ISNULL( t.pov_phone4full, '') OR 
          ISNULL( s.phone5full, '') <> ISNULL( t.pov_phone5full, '') OR 
          ISNULL( s.email1, '') <> ISNULL( t.pov_email1, '')  

            OR (s.phone1full <> t.pov_phone1full AND s.phone1full <> t.pov_phone2full AND s.phone1full <> t.pov_phone3full AND s.phone1full <> t.pov_phone4full AND s.phone1full <> t.pov_phone5full ) 
            OR (s.phone2full <> t.pov_phone1full AND s.phone2full <> t.pov_phone2full AND s.phone2full <> t.pov_phone3full AND s.phone2full <> t.pov_phone4full AND s.phone2full <> t.pov_phone5full ) 
            OR (s.phone3full <> t.pov_phone1full AND s.phone3full <> t.pov_phone2full AND s.phone3full <> t.pov_phone3full AND s.phone3full <> t.pov_phone4full AND s.phone3full <> t.pov_phone5full ) 
            OR (s.phone4full <> t.pov_phone1full AND s.phone4full <> t.pov_phone2full AND s.phone4full <> t.pov_phone3full AND s.phone4full <> t.pov_phone4full AND s.phone4full <> t.pov_phone5full ) 
            OR (s.phone5full <> t.pov_phone1full AND s.phone5full <> t.pov_phone2full AND s.phone5full <> t.pov_phone3full AND s.phone5full <> t.pov_phone4full AND s.phone5full <> t.pov_phone5full )
    )

    , fieldsToRows 
         AS (SELECT 
                id,
                field,
                Value

             FROM   data p UNPIVOT
                           (value FOR field IN (nameFull, pov_nameFull, 
                                                    salutation, pov_salutation, 
                                                    nameFirst, pov_nameFirst, 
                                                    nameLast, pov_nameLast, 
                                                    addressLine1, pov_addressLine1, 
                                                    addressLine2, pov_addressLine2, 
                                                    addressCity, pov_addressCity, 
                                                    addressState, pov_addressState, 
                                                    addressZip, pov_addressZip, 
                                                    phone1full, pov_phone1full, 
                                                    phone2full, pov_phone2full, 
                                                    phone3full, pov_phone3full, 
                                                    phone4full, pov_phone4full, 
                                                    phone5full, pov_phone5full, 
                                                    email1, pov_email1))
                    AS unpvt
            ) 
            SELECT 
                    curr.id,
                    curr.field,
                    curr.value new_value,
                    prev.value  old_value,
                    CASE WHEN curr.value <> prev.value THEN 'Yes'  END Changed


    FROM 
            fieldsToRows curr 
            INNER  JOIN  fieldsToRows prev
            ON curr.ID = prev.id
                AND curr.field  = 'pov_' + prev.field

答案 3 :(得分:9)

这是UIImage的扩展程序,其目标是 Swift 4.0 ,只需旋转图片而无需UIImageView。成功测试了图像是否已旋转,而不只是更改了exif数据。

import UIKit

extension UIImage {
    func rotate(radians: CGFloat) -> UIImage {
        let rotatedSize = CGRect(origin: .zero, size: size)
            .applying(CGAffineTransform(rotationAngle: CGFloat(radians)))
            .integral.size
        UIGraphicsBeginImageContext(rotatedSize)
        if let context = UIGraphicsGetCurrentContext() {
            let origin = CGPoint(x: rotatedSize.width / 2.0,
                                 y: rotatedSize.height / 2.0)
            context.translateBy(x: origin.x, y: origin.y)
            context.rotate(by: radians)
            draw(in: CGRect(x: -origin.y, y: -origin.x,
                            width: size.width, height: size.height))
            let rotatedImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            return rotatedImage ?? self
        }

        return self
    }
}

要执行180度旋转,您可以这样调用:

let rotatedImage = image.rotate(radians: .pi)

如果由于某种原因无法旋转,则会返回原始图像。

答案 4 :(得分:7)

在Swift 4.2和Xcode 10.0中

dropDownImageView.transform = dropDownImageView.transform.rotated(by: CGFloat(Double.pi / 2))

如果要添加动画...

UIView.animate(withDuration: 2.0, animations: {
   self.dropDownImageView.transform = self.dropDownImageView.transform.rotated(by: CGFloat(Double.pi / 2))
})

答案 5 :(得分:6)

您可以将以下代码用于Swift 3:

<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" ToolTip="Search" CssClass="btn btn-success" formnovalidate  />

答案 6 :(得分:3)

通过UIGraphics旋转图像上下文是比较繁琐的操作。您可能会看到质量下降和内存增加的问题。

我建议您尝试旋转图层或查看自身。

extension UIView {


    func rotate(degrees: CGFloat) {

        let degreesToRadians: (CGFloat) -> CGFloat = { (degrees: CGFloat) in
            return degrees / 180.0 * CGFloat.pi
        }
        self.transform =  CGAffineTransform(rotationAngle: degreesToRadians(degrees))

        // If you like to use layer you can uncomment the following line 
        //layer.transform = CATransform3DMakeRotation(degreesToRadians(degrees), 0.0, 0.0, 1.0)
    }
}

使用方法

yourImageView.rotate(degrees: 40)

答案 7 :(得分:2)

您可以先在imageView中设置图像,然后旋转在imageView中获取图像

下面:

let customImageView = UIImageView()
customImageView.frame = CGRect.init(x: 0, y: 0, w: 250, h: 250)
customImageView.image = UIImage(named: "yourImage")

customImageView .transform = customImageView .transform.rotated(by: CGFloat.init(M_PI_2))
var rotatedImage = UIImage()
rotatedImage = customImageView.image!

答案 8 :(得分:1)

您的代码与功能相差无几。您可以直接将变换应用于位图,不需要中间视图:

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(M_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
}

此外,如果您要创建一个旋转图像的函数,通常可以包含clockwise: Bool参数,该参数将degrees参数解释为顺时针旋转或不旋转。我留给你的实现和适当的弧度转换。

另请注意,假设oldImage.size非零,我手上有点波浪状。如果是,强制解包UIGraphicsGetCurrentContext()!可能会崩溃。您应该验证oldImage的大小,如果它无效,只需返回oldImage

答案 9 :(得分:0)

您的问题是您使用不存在的CGRect初始化程序。如果要使用 CGRect(原点:大小:) ,请正确创建原点,不带宽度和高度参数。或删除尺寸参数并使用 CGRect(x:y:width:height :)

只需替换此行

bitmap.draw(oldImage, in:  CGRect(origin: (x: -oldImage.size.width / 2,  y: -oldImage.size.height / 2, width:  oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))

这一个:

let rect = CGRect(origin: CGPoint(x: -oldImage.size.width / 2,  y: -oldImage.size.height / 2), size: oldImage.size)
bitmap.draw(oldImage.cgImage!, in: rect)

答案 10 :(得分:0)

ImageView?.transform = transform.rotated(by: (CGFloat(Double.pi / 2)))

Swift 4.2

旋转-对。效果很好。

答案 11 :(得分:0)

如果您只是不想进行特定的旋转,而是希望一一使用所有方向。

func rotateImage() -> UIImage {
    let newOrientation = Orientation(rawValue: self.imageOrientation.rawValue + 1) ?? UIImage.Orientation(rawValue: 0)
    return UIImage(cgImage: self.cgImage!, scale: self.scale, orientation: newOrientation!)
}

答案 12 :(得分:0)

UIGraphicsBeginImageContext(CGSize(width: bitmap.width, height: bitmap.height))
UIImage(cgImage: oldImage.cgImage, scale: 1, orientation: .leftMirrored).draw(at: .zero)
let image = UIGraphicsGetImageFromCurrentImageContext()!

短得多。