如果将滤镜应用于高度>宽度的PNG,则会将图像旋转90度。 我如何有效地防止这种情况?

我在做一个简单的filter应用程序。 我发现,如果您从相机胶卷加载的图像是PNG(PNG没有定向数据标志),并且高度大于宽度,则在对图像应用特定的失真滤镜后,它将旋转并呈现自身仿佛是一幅风景画。

我在网上的某个地方发现了下面的技巧,我打开了许多标签,它似乎正是我想要的。 它首次加载时使用图像的原始比例和方向。

let newImage = UIImage(CIImage:(output), scale: 1.0, orientation: self.origImage.imageOrientation) 

但是当我尝试使用它时,这是我得到的警告:

 Ambiguous use of 'init(CIImage:scale:orientation:)' 

这是我想要工作的整个事情:

 //global variables var image: UIImage! var origImage: UIImage! func setFilter(action: UIAlertAction) { origImage = image // make sure we have a valid image before continuing! guard let image = self.imageView.image?.cgImage else { return } let openGLContext = EAGLContext(api: .openGLES3) let context = CIContext(eaglContext: openGLContext!) let ciImage = CIImage(cgImage: image) let currentFilter = CIFilter(name: "CIBumpDistortion") currentFilter?.setValue(ciImage, forKey: kCIInputImageKey) if let output = currentFilter?.value(forKey: kCIOutputImageKey) as? CIImage{ //the line below is the one giving me errors which i thought would work. let newImage = UIImage(CIImage:(output), scale: 1.0, orientation: self.image.imageOrientation) self.imageView.image = UIImage(cgImage: context.createCGImage(newImage, from: output.extent)!)} 

filter都能正常工作,不幸的是,出于我怀疑的原因,将上述图像转为90度。

我已经尝试了一些其他方法,比如使用扩展来检查UIimages的方向,并使用扩展名将CIimage转换为Uiimage,然后尝试将其转换回Ciimage,或者只是将UIimage加载到imageView以进行输出。 那个过程之后,我遇到了麻烦。 我开始看起来真的很复杂,只是为了获得某些图像的默认方向。

任何build议将不胜感激!

编辑:inheritance人我得到了我想要的方法: 当应用filter到UIImage结果倒挂

我find了答案。 我最大的问题是“模糊使用'init(CIImage:scale:orientation :)'”

事实certificate,Xcode自动填充代码为“CIImage:scale:orientation”,当它应该是ciImage:scale:orientation'这个非常模糊的错误留下了一个新的开发者,像我的头挠了3天。 (对于CGImage和UIImage inits也是如此,但是我最初的错误是用CIImage,所以我用它来解释。)

有了这些知识,我就可以为我的新输出制定下面的代码:

 if let output = currentFilter?.value(forKey: kCIOutputImageKey) as? CIImage{ let outputImage = UIImage(cgImage: context.createCGImage(output, from: output.extent)!) let imageTurned = UIImage(cgImage: outputImage.cgImage!, scale: CGFloat(1.0), orientation: origImage.imageOrientation) centerScrollViewContents() self.imageView.image = imageTurned } 

这段代码replace了OP中的if let输出。