【问题标题】:iOS - UIImageView - how to handle UIImage image orientationiOS - UIImageView - 如何处理 UIImage 图像方向
【发布时间】:2012-02-13 11:55:21
【问题描述】:

是否可以设置UIImageView 来处理图像方向?当我将UIImageView 设置为具有方向RIGHT 的图像时(它是相机胶卷中的照片),图像向右旋转,但我想以正确的方向显示它,因为它是拍摄的。

我知道我可以旋转图像数据,但可以做得更优雅吗?

【问题讨论】:

    标签: ios uiimageview uiimage orientation


    【解决方案1】:

    如果我理解,您想要做的是忽略 UIImage 的方向?如果是这样,那么您可以这样做:

    UIImage *originalImage = [... whatever ...];
    
    UIImage *imageToDisplay =
         [UIImage imageWithCGImage:[originalImage CGImage]
                  scale:[originalImage scale]
                  orientation: UIImageOrientationUp];
    

    因此,您正在创建一个新的 UIImage,其像素数据与原始数据相同(通过其 CGImage 属性引用),但您指定的方向不旋转数据。

    【讨论】:

    • 顺便问一下,我怎样才能真正旋转图像数据?
    • 我猜你会用CGBitmapContextCreate(或UIGraphicsBeginImageContext简写)创建一个大小合适的CGContext,使用CGContextRotateCTM设置旋转,使用drawInRect: UIImageCGContextDrawImage 带有图像的 CGImage 属性,然后将上下文转换为图像,如果您使用 UIKit 创建上下文,则使用 UIGraphicsGetImageFromCurrentImageContext(然后是 UIGraphicsEndImageContext),或者如果使用 CGBitmapContextCreateImage你坚持使用核心图形。 UIKit 不是线程安全的,但代码会更整洁。
    • 当我将图像放入 ImageView 时,我无法让它工作......即使我正在创建具有镜像方向的图像,它也只是以原始方向显示图像:[UIImage imageWithCGImage:image.CGImage scale:image.scaleorientation:UIImageOrientationUpMirrored]...OP 询问有关使用 ImageView 但我无法让此解决方案在 ImageView 中工作...
    • 适用于 PNG,但不适用于 HEIC。
    【解决方案2】:

    您可以完全避免手动进行转换和缩放,正如 an0 在此答案 here 中所建议的那样:

    - (UIImage *)normalizedImage {
        if (self.imageOrientation == UIImageOrientationUp) return self; 
    
        UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
        [self drawInRect:(CGRect){0, 0, self.size}];
        UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return normalizedImage;
    }
    

    UIImage 方法sizedrawInRect 的文档明确声明它们考虑了方向。

    【讨论】:

    • 这是救命稻草。
    • 我在哪里粘贴这个?
    【解决方案3】:

    斯威夫特 3.1

    func fixImageOrientation(_ image: UIImage)->UIImage {
        UIGraphicsBeginImageContext(image.size)
        image.draw(at: .zero)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage ?? image
    }
    

    【讨论】:

    • 这是一个完美的解决方案:)
    • 你值得拥有我的朋友
    • 这比that 好。这在 swift 4 中有效,但事实并非如此。
    • 谢谢。如果您需要将图像上传到服务器,则此方法有效,而不仅仅是显示为大多数其他答案。
    • 效果很好。拍摄任何图像并以 .up 方向保存
    【解决方案4】:

    此方法首先检查UIImage的当前方向,然后以顺时针方向改变方向并返回UIImage。您可以将此图像显示为

    self.imageView.image = rotateImage(currentUIImage)

       func rotateImage(image:UIImage)->UIImage
        {
            var rotatedImage = UIImage();
            switch image.imageOrientation
            {
                case UIImageOrientation.Right:
                rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Down);
    
               case UIImageOrientation.Down:
                rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Left);
    
                case UIImageOrientation.Left:
                rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Up);
    
                 default:
                rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Right);
            }
            return rotatedImage;
        }
    

    Swift 4 版本

    func rotateImage(image:UIImage) -> UIImage
        {
            var rotatedImage = UIImage()
            switch image.imageOrientation
            {
            case .right:
                rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .down)
    
            case .down:
                rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .left)
    
            case .left:
                rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .up)
    
            default:
                rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .right)
            }
    
            return rotatedImage
        }
    

    【讨论】:

    • 您好 Varender,感谢您对 SO 的帮助。你能谈谈你认为这可能对马丁有什么帮助吗?您的解决方案比旋转数据更优雅吗?
    • 1.我们将从 UIImageView 获取当前 UIImage 2. 我们将调用此方法 (rotateImage) 并将此当前 UIImage 作为参数传递 3. 将返回值存储到 UIImageView.image /* 这将在图像视图中旋转数据:): )
    • 先生,在我看来这是最好的答案,因为如果我们将旋转整个 UIImageView 那么 UIImageView X 是一个负值。但是如果我们旋转数据,那么 UIImageView 将保持原位,只有数据会被旋转。如果你采用方形 UIImageView,那么你可以使用 CGAffineTransformMakeRotate 简单地转换整个 UIImageView。
    • 这应该是公认的答案!像魅力一样工作:)
    • 在 swift 3 中:rotatedImage = UIImage(cgImage:image.cgImage!, scale: 1,orientation:UIImageOrientation.right)
    【解决方案5】:

    我将Anomie's answer here 中的代码(上面由 suvish valsan 复制粘贴)转换为 Swift

    func fixOrientation() -> UIImage {
        if self.imageOrientation == UIImageOrientation.Up {
            return self
        }
    
        var transform = CGAffineTransformIdentity
    
        switch self.imageOrientation {
        case .Down, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI));
    
        case .Left, .LeftMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0);
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2));
    
        case .Right, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, self.size.height);
            transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2));
    
        case .Up, .UpMirrored:
            break
        }
    
        switch self.imageOrientation {
    
        case .UpMirrored, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
    
        case .LeftMirrored, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, self.size.height, 0)
            transform = CGAffineTransformScale(transform, -1, 1);
    
        default:
            break;
        }
    
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx = CGBitmapContextCreate(
            nil,
            Int(self.size.width),
            Int(self.size.height),
            CGImageGetBitsPerComponent(self.CGImage),
            0,
            CGImageGetColorSpace(self.CGImage),
            UInt32(CGImageGetBitmapInfo(self.CGImage).rawValue)
        )
    
        CGContextConcatCTM(ctx, transform);
    
        switch self.imageOrientation {
        case .Left, .LeftMirrored, .Right, .RightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height,self.size.width), self.CGImage);
    
        default:
            CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.width,self.size.height), self.CGImage);
            break;
        }
    
        // And now we just create a new UIImage from the drawing context
        let cgimg = CGBitmapContextCreateImage(ctx)
    
        let img = UIImage(CGImage: cgimg!)
    
        return img;
    }
    

    (我用self替换了所有出现的参数image,因为我的代码是UIImage的扩展)。


    编辑: Swift 3 版本。

    该方法返回一个可选的,因为许多中间调用可能会失败,我不喜欢使用!

    func fixOrientation() -> UIImage? {
    
        guard let cgImage = self.cgImage else {
            return nil
        }
    
        if self.imageOrientation == UIImageOrientation.up {
            return self
        }
    
        let width  = self.size.width
        let height = self.size.height
    
        var transform = CGAffineTransform.identity
    
        switch self.imageOrientation {
        case .down, .downMirrored:
            transform = transform.translatedBy(x: width, y: height)
            transform = transform.rotated(by: CGFloat.pi)
    
        case .left, .leftMirrored:
            transform = transform.translatedBy(x: width, y: 0)
            transform = transform.rotated(by: 0.5*CGFloat.pi)
    
        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0, y: height)
            transform = transform.rotated(by: -0.5*CGFloat.pi)
    
        case .up, .upMirrored:
            break
        }
    
        switch self.imageOrientation {
        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
    
        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: height, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
    
        default:
            break;
        }
    
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        guard let colorSpace = cgImage.colorSpace else {
            return nil
        }
    
        guard let context = CGContext(
            data: nil,
            width: Int(width),
            height: Int(height),
            bitsPerComponent: cgImage.bitsPerComponent,
            bytesPerRow: 0,
            space: colorSpace,
            bitmapInfo: UInt32(cgImage.bitmapInfo.rawValue)
            ) else {
                return nil
        }
    
        context.concatenate(transform);
    
        switch self.imageOrientation {
    
        case .left, .leftMirrored, .right, .rightMirrored:
            // Grr...
            context.draw(cgImage, in: CGRect(x: 0, y: 0, width: height, height: width))
    
        default:
            context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
        }
    
        // And now we just create a new UIImage from the drawing context
        guard let newCGImg = context.makeImage() else {
            return nil
        }
    
        let img = UIImage(cgImage: newCGImg)
    
        return img;
    }
    

    (注意:Swift 3 版本的 odes 在 Xcode 8.1 下编译,但尚未测试它是否真的有效。可能某处有错字,混淆了宽度/高度等。请随时指出/修复任何错误)。

    【讨论】:

    • 我在转换为 swift 3 后使用了上面的代码。如果有人需要 swift 3 版本,请在下面查看我的答案
    • 图像方向完全没有改变。抱歉,我是 iOS 开发新手。我所做的是,我将该函数用于 UIImage 扩展,然后以编程方式将其设置在 func viewDidLoad 中。此图片来自三星手机photos.google.com/share/…,包含 270 个 CW 方向 exif 数据。这是我如何使用它let background: UIImage? = UIImage(named: "background_image")?.fixOrientation() backgroundImage.image = background
    • 有人使用这个@Nicolas 遇到内存泄漏问题吗?看起来 CGImages 没有被释放。我的应用程序是一个海量照片管理应用程序,可以处理许多照片。此函数似乎在每次运行时都在泄漏内存。有什么快速解决办法吗?
    • @MichaelReilly 嗯,还没有详细查看它,但是 CoreGraphics 调用应该可以在 swift 中与 ARC 一起使用。
    • @MichaelReilly 我找到了这个答案,这似乎证实了我的观察:stackoverflow.com/a/25790214/433373
    【解决方案6】:

    Swift 中的 UIImage 扩展。你根本不需要做所有的翻转,真的。 Objective-C original is here,但我添加了尊重原始图像 alpha 的位(粗略,但它可以区分不透明图像和透明图像)。

    // from https://github.com/mbcharbonneau/UIImage-Categories/blob/master/UIImage%2BAlpha.m
    // Returns true if the image has an alpha layer
        private func hasAlpha() -> Bool {
            guard let cg = self.cgImage else { return false }
            let alpha = cg.alphaInfo
            let retVal = (alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast)
            return retVal
        }
    
        func normalizedImage() -> UIImage? {
            if self.imageOrientation == .up {
                return self
            }
            UIGraphicsBeginImageContextWithOptions(self.size, !self.hasAlpha(), self.scale)
            var rect = CGRect.zero
            rect.size = self.size
            self.draw(in: rect)
            let retVal = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return retVal
        }
    

    【讨论】:

      【解决方案7】:

      考虑到图像方向,这是一个可行的示例代码:

      #define rad(angle) ((angle) / 180.0 * M_PI)
      - (CGAffineTransform)orientationTransformedRectOfImage:(UIImage *)img
      {
          CGAffineTransform rectTransform;
          switch (img.imageOrientation)
          {
              case UIImageOrientationLeft:
                  rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -img.size.height);
                  break;
              case UIImageOrientationRight:
                  rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -img.size.width, 0);
                  break;
              case UIImageOrientationDown:
                  rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -img.size.width, -img.size.height);
                  break;
              default:
                  rectTransform = CGAffineTransformIdentity;
          };
      
          return CGAffineTransformScale(rectTransform, img.scale, img.scale);
      }
      
      
      - (UIImage *)croppedImage:(UIImage*)orignialImage InRect:(CGRect)visibleRect{
          //transform visible rect to image orientation
          CGAffineTransform rectTransform = [self orientationTransformedRectOfImage:orignialImage];
          visibleRect = CGRectApplyAffineTransform(visibleRect, rectTransform);
      
          //crop image
          CGImageRef imageRef = CGImageCreateWithImageInRect([orignialImage CGImage], visibleRect);
          UIImage *result = [UIImage imageWithCGImage:imageRef scale:orignialImage.scale orientation:orignialImage.imageOrientation];
          CGImageRelease(imageRef);
          return result;
      }
      

      【讨论】:

        【解决方案8】:

        我将代码从@Nicolas Miari 的答案转换为 Swift 3,以防万一有人需要

        func fixOrientation() -> UIImage
        {
        
            if self.imageOrientation == UIImageOrientation.up {
                return self
            }
        
            var transform = CGAffineTransform.identity
        
            switch self.imageOrientation {
            case .down, .downMirrored:
                transform = transform.translatedBy(x: self.size.width, y: self.size.height)
                transform = transform.rotated(by: CGFloat(M_PI));
        
            case .left, .leftMirrored:
                transform = transform.translatedBy(x: self.size.width, y: 0);
                transform = transform.rotated(by: CGFloat(M_PI_2));
        
            case .right, .rightMirrored:
                transform = transform.translatedBy(x: 0, y: self.size.height);
                transform = transform.rotated(by: CGFloat(-M_PI_2));
        
            case .up, .upMirrored:
                break
            }
        
        
            switch self.imageOrientation {
        
            case .upMirrored, .downMirrored:
                transform = transform.translatedBy(x: self.size.width, y: 0)
                transform = transform.scaledBy(x: -1, y: 1)
        
            case .leftMirrored, .rightMirrored:
                transform = transform.translatedBy(x: self.size.height, y: 0)
                transform = transform.scaledBy(x: -1, y: 1);
        
            default:
                break;
            }
        
            // Now we draw the underlying CGImage into a new context, applying the transform
            // calculated above.
            let ctx = CGContext(
                data: nil,
                width: Int(self.size.width),
                height: Int(self.size.height),
                bitsPerComponent: self.cgImage!.bitsPerComponent,
                bytesPerRow: 0,
                space: self.cgImage!.colorSpace!,
                bitmapInfo: UInt32(self.cgImage!.bitmapInfo.rawValue)
            )
        
        
        
            ctx!.concatenate(transform);
        
            switch self.imageOrientation {
        
            case .left, .leftMirrored, .right, .rightMirrored:
                // Grr...
                ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.height ,height:self.size.width))
        
            default:
                ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.width ,height:self.size.height))
                break;
            }
        
            // And now we just create a new UIImage from the drawing context
            let cgimg = ctx!.makeImage()
        
            let img = UIImage(cgImage: cgimg!)
        
            return img;
        
        }
        

        【讨论】:

        • 在委托方法imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any] let imageCaptured:UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage捕获图像后,图像始终是正确的方向,此方法返回图像:(
        • 是的,图像方向始终是正确的,但它在 UIImageView 上正确显示。 Apple 有一些内部数据用于正确显示
        【解决方案9】:

        如果您需要旋转并修复扩展下方的图像方向会很有用。

        extension UIImage {
        
            public func imageRotatedByDegrees(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: self.size.width, height: self.size.height))
                let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat.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.pi / 180))
                //Now, draw the rotated/scaled image into the context
                bitmap.scaleBy(x: 1.0, y: -1.0)
                bitmap.draw(self.cgImage!, in: CGRect(x: -self.size.width / 2, y: -self.size.height / 2, width: self.size.width, height: self.size.height))
                let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
                UIGraphicsEndImageContext()
                return newImage
            }
        
        
            public func fixedOrientation() -> UIImage {
                if imageOrientation == UIImageOrientation.up {
                    return self
                }
        
                var transform: CGAffineTransform = CGAffineTransform.identity
        
                switch imageOrientation {
                case UIImageOrientation.down, UIImageOrientation.downMirrored:
                    transform = transform.translatedBy(x: size.width, y: size.height)
                    transform = transform.rotated(by: CGFloat.pi)
                    break
                case UIImageOrientation.left, UIImageOrientation.leftMirrored:
                    transform = transform.translatedBy(x: size.width, y: 0)
                    transform = transform.rotated(by: CGFloat.pi/2)
                    break
                case UIImageOrientation.right, UIImageOrientation.rightMirrored:
                    transform = transform.translatedBy(x: 0, y: size.height)
                    transform = transform.rotated(by: -CGFloat.pi/2)
                    break
                case UIImageOrientation.up, UIImageOrientation.upMirrored:
                    break
                }
        
                switch imageOrientation {
                case UIImageOrientation.upMirrored, UIImageOrientation.downMirrored:
                    transform.translatedBy(x: size.width, y: 0)
                    transform.scaledBy(x: -1, y: 1)
                    break
                case UIImageOrientation.leftMirrored, UIImageOrientation.rightMirrored:
                    transform.translatedBy(x: size.height, y: 0)
                    transform.scaledBy(x: -1, y: 1)
                case UIImageOrientation.up, UIImageOrientation.down, UIImageOrientation.left, UIImageOrientation.right:
                    break
                }
        
                let ctx: CGContext = CGContext(data: nil,
                                               width: Int(size.width),
                                               height: Int(size.height),
                                               bitsPerComponent: self.cgImage!.bitsPerComponent,
                                               bytesPerRow: 0,
                                               space: self.cgImage!.colorSpace!,
                                               bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!
        
                ctx.concatenate(transform)
        
                switch imageOrientation {
                case UIImageOrientation.left, UIImageOrientation.leftMirrored, UIImageOrientation.right, UIImageOrientation.rightMirrored:
                    ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.height, height: size.width))
                default:
                    ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
                    break
                }
        
                let cgImage: CGImage = ctx.makeImage()!
        
                return UIImage(cgImage: cgImage)
            }
        }
        

        【讨论】:

          【解决方案10】:

          感谢 Waseem05 的 Swift 3 翻译,但他的方法仅在我将其包装在 UIImage 的扩展中并将其放置在父类之外/下方时才对我有用,如下所示:

          extension UIImage {
          
                  func fixOrientation() -> UIImage
                  {
          
                      if self.imageOrientation == UIImageOrientation.up {
                      return self
                  }
          
                  var transform = CGAffineTransform.identity
          
                  switch self.imageOrientation {
                  case .down, .downMirrored:
                      transform = transform.translatedBy(x: self.size.width, y: self.size.height)
                      transform = transform.rotated(by: CGFloat(M_PI));
          
                  case .left, .leftMirrored:
                      transform = transform.translatedBy(x: self.size.width, y: 0);
                      transform = transform.rotated(by: CGFloat(M_PI_2));
          
                  case .right, .rightMirrored:
                      transform = transform.translatedBy(x: 0, y: self.size.height);
                      transform = transform.rotated(by: CGFloat(-M_PI_2));
          
                  case .up, .upMirrored:
                      break
                  }
          
          
                  switch self.imageOrientation {
          
                  case .upMirrored, .downMirrored:
                      transform = transform.translatedBy(x: self.size.width, y: 0)
                      transform = transform.scaledBy(x: -1, y: 1)
          
                  case .leftMirrored, .rightMirrored:
                      transform = transform.translatedBy(x: self.size.height, y: 0)
                      transform = transform.scaledBy(x: -1, y: 1);
          
                  default:
                      break;
                  }
          
                  // Now we draw the underlying CGImage into a new context, applying the transform
                  // calculated above.
                  let ctx = CGContext(
                      data: nil,
                      width: Int(self.size.width),
                      height: Int(self.size.height),
                      bitsPerComponent: self.cgImage!.bitsPerComponent,
                      bytesPerRow: 0,
                      space: self.cgImage!.colorSpace!,
                      bitmapInfo: UInt32(self.cgImage!.bitmapInfo.rawValue)
                  )
          
          
          
                  ctx!.concatenate(transform);
          
                  switch self.imageOrientation {
          
                  case .left, .leftMirrored, .right, .rightMirrored:
                      // Grr...
                      ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.height ,height:self.size.width))
          
                  default:
                      ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.width ,height:self.size.height))
                      break;
                  }
          
                  // And now we just create a new UIImage from the drawing context
                  let cgimg = ctx!.makeImage()
          
                  let img = UIImage(cgImage: cgimg!)
          
                  return img;
          
              }
          }
          

          然后调用它:

          let correctedImage:UIImage = wonkyImage.fixOrientation()
          

          然后一切都很好!当我们不需要前置/后置摄像头和上/下/左/右设备方向元数据时,Apple 应该更容易丢弃方向。

          【讨论】:

            【解决方案11】:
            extension UIImage {
                func fixImageOrientation() -> UIImage {
                    UIGraphicsBeginImageContext(self.size)
                    self.draw(at: .zero)
                    let newImage = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()
                    return newImage ?? self
                }
            }
            
            1. 像上面的例子一样创建扩展。
            2. 致电:imageView.image?.fixImageOrientation()UIImage(named: "someImage").fixImageOrientation()

            3. 祝大家好运!

            【讨论】:

            • 这很好用。但是内存会像任何东西一样堆积起来,如果在循环中调用它,应用程序就会崩溃。
            • @abhimuralidharan,我没有在循环中检查它,但 100% 存在一种应用方式。
            【解决方案12】:

            Swift 3.0 版汤米的回答

            let imageToDisplay = UIImage.init(cgImage: originalImage.cgImage!, scale: originalImage.scale, orientation: UIImageOrientation.up)
            

            【讨论】:

              【解决方案13】:

              灵感来自@Aqua Answer.....

              在目标 C 中

              - (UIImage *)fixImageOrientation:(UIImage *)img {
              
                 UIGraphicsBeginImageContext(img.size);
                 [img drawAtPoint:CGPointZero];
              
                 UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
                 UIGraphicsEndImageContext();
              
                 if (newImg) {
                     return newImg;
                 }
              
                 return img;
              }
              

              【讨论】:

                【解决方案14】:

                我尝试了选中标记的解决方案,但它对我不起作用。 但以下解决方案适用于在转换为 png 之前从相机固定方向。

                斯威夫特 5:

                let imageToDisplay = originalImage.resize(new: originalImage.resize)
                

                【讨论】:

                • 尝试用更具描述性的评论来回答问题,并用合适的答案回答问题
                • @JhonnyTawk 感谢您的建议,我编辑了答案
                猜你喜欢
                • 2011-04-16
                • 2012-07-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-12-01
                • 1970-01-01
                相关资源
                最近更新 更多