应用CIFIlter后设置UIImageView内容模式

sle*_*rfx 12 iphone objective-c core-image uiimageview ios

谢谢你的期待.

这是我的代码

 CIImage *result = _vignette.outputImage;
self.mainImageView.image = nil;
//self.mainImageView.contentMode = UIViewContentModeScaleAspectFit;
self.mainImageView.image = [UIImage imageWithCIImage:result];
self.mainImageView.contentMode = UIViewContentModeScaleAspectFit;
Run Code Online (Sandbox Code Playgroud)

在这里_vignette正确设置过滤器,图像效果正确应用于图像.

我正在使用分辨率为500x375的源图像.我的imageView几乎拥有iPhone屏幕的分辨率.所以为了避免拉伸我正在使用AspectFit.

但是在我将结果图像分配回我的imageView后应用效果后,它会拉伸.无论UIViewContentMode我用哪个.它不起作用.ScaleToFill无论我给出的过滤器如何,它似乎总是适用.

知道为什么会这样吗?任何建议都非常感谢.

mat*_*att 23

(1)Aspect Fit 确实拉伸图像 - 适合.如果您根本不想拉伸图像,请使用中心(例如).

(2)imageWithCIImage给你一个非常奇怪的野兽,一个不基于CGImage的UIImage,因此不受普通的图层显示规则的影响.它实际上只不过是CIImage的薄包装,这不是你想要的.你必须通过CGImage将CIFilter输出转换(渲染)到UIImage,从而为你提供一个实际上有一些位的UIImage(CGImage,一个位图).我在这里的讨论为您提供了演示代码:

http://www.apeth.com/iOSBook/ch15.html#_cifilter_and_ciimage

换句话说,在某些时候,您必须调用CIContext createCGImage:fromRect:从CIFilter的输出生成CGImageRef,并将其传递给UIImage.在您这样做之前,您没有将过滤器操作的输出作为真正的UIImage.

或者,您可以将图像绘制imageWithCIImage到图形上下文中.例如,您可以将其绘制到图像图形上下文中,然后使用图像.

不能做的是imageWithCIImage直接显示图像.那是因为它不是图像!它没有底层位图(CGImage).那里没有.它只是一组用于导出图像的CIFilter指令.

  • 我一直告诉你,但你似乎不相信我.将图像视图的图像设置为使用`imageWithCIImage:`创建的UIImage不起作用. (2认同)