2017-04-30 93 views
1

将CIFilter应用于使用相机拍摄的照片后,所拍摄的图像会自动收缩并重新定位。将CIFilter应用于UIImage会导致调整大小和重新定位图像

我在想,如果我能够获得原始图像的大小和方向,它将相应地缩放并将图像视图固定到屏幕的角落。然而,这种方法没有什么改变,也没有意识到我可以正确地将图像缩放到屏幕的全尺寸。

func applyBloom() -> UIImage { 
    let ciImage = CIImage(image: image) // image is from UIImageView 

    let filteredImage = ciImage?.applyingFilter("CIBloom", 
               withInputParameters: [ kCIInputRadiusKey: 8, 
                    kCIInputIntensityKey: 1.00 ]) 
    let originalScale = image.scale 
    let originalOrientation = image.imageOrientation 


    if let image = filteredImage { 
    let image = UIImage(ciImage: image, scale: originalScale, orientation: originalOrientation) 
    return image 
    } 

    return self.image 
} 

图片说明: 照片捕获并与空间距作为一个图像收缩的结果的图像的屏幕截图。

enter image description here

+0

从CIImage到UIImage的转换中删除'scale'和'orientation'参数,事情会很好 –

回答

2

尝试这样的事情。替换:

func applyBloom() -> UIImage { 
    let ciInputImage = CIImage(image: image) // image is from UIImageView 
    let ciOutputImage = ciInputImage?.applyingFilter("CIBloom", 
              withInputParameters: [kCIInputRadiusKey: 8, kCIInputIntensityKey: 1.00 ]) 
    let context = CIContext() 
    let cgOutputImage = context.createCGImage(ciOutputImage, from: ciInputImage.extent) 
    return UIImage(cgImage: cgOutputImage!) 
} 
  • 我保持各种变量来帮助解释发生了什么。
  • 显然,根据您的代码,可能需要对可选项和展开进行一些调整。

发生了什么是 - 采取过滤/输出CIImage,并使用CIContext,写一个CGImage输入CIImage的大小。

  • 请注意,CIContext价格昂贵。如果你已经创建了一个,你应该可以使用它。
  • 非常多,UIImage 尺寸与CIImage 范围相同。 (我说的很多,因为一些生成的CIImages可能有范围无限范围。)
  • 根据您的具体需求(和您的UIImageView),您可能希望使用输出CIImage范围。通常情况下,它们是一样的。

最后,一个建议。如果您试图使用CIFilter对图像(如照片编辑器)进行“接近实时”更改,请考虑使用CIImages和012i优于UIImages和UIImageView的主要性能改进。前者使用设备GPU而不是CPU。

+0

我很欣赏这个解释的细节!解决方案工作约90%。就像我之前创建上下文的尝试一样,输出会将图像旋转90度。方向的简单修复就是一个窍门。 我可能需要做一些关于使用CIContext和EAGLContext的研究,以便通过CPU使用GPU来计算出最佳的攻击计划。非常感谢,您提供的所有信息都帮助了很多! – lifewithelliott

+1

@lifewithelliott,这是CoreImage的一个很好的链接:https://www.objc.io/issues/21-camera-and-photos/core-image-intro/到顶部是一个链接到一个GitHub项目,他们被分类GLKView作为FilteredImageView。它具有设置来处理不同的contentModes(aspectFit,aspectFIll等),同时设置EAGLContext和CIContext。 – dfd

+0

我最近发现CIFilters在通过相机图像更新的图像上执行时使用标准iPhone相机分辨率。这根本不匹配像素或点分辨率。例如,iPhone 6s plus使用1280x720。 – VagueExplanation

相关问题