【问题标题】:Imageview not resetting to original after sharpness filter used使用锐度滤镜后,Imageview 未重置为原始图像
【发布时间】:2017-12-22 22:01:32
【问题描述】:

在 imageview 上应用过滤器后无法获得原始图像。因为我想在将滑块从 1 移动到 0 后获得原始图像(最大值到最小值,我的意思是反向)。 下面是应用锐度效果的代码

- (IBAction)actionSharp:(UISlider *)sender {


    demoImage = _affectView.image;
    CIImage* image = [CIImage imageWithCGImage:demoImage.CGImage];
    CIContext *context = [CIContext contextWithOptions:nil];
    NSNumber *testNSNumber = [NSNumber numberWithFloat:_sharpActionWithSlider.value];
    NSLog(@"ffghhn %f",_sharpActionWithSlider.value);
    CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CISharpenLuminance" keysAndValues: @"inputImage", image, nil];

    [gaussianBlurFilter setDefaults];
    [gaussianBlurFilter setValue:testNSNumber forKey:kCIInputSharpnessKey];
    [gaussianBlurFilter setDefaults];
    CIImage *result2 = [gaussianBlurFilter valueForKey:kCIOutputImageKey];
    CGImageRef cgImage = [context createCGImage:result2 fromRect:[result2 extent]];
    UIImage *sharp= [UIImage imageWithCGImage:cgImage];
    UIImage *p = sharp;
    self.affectView.image= p;
    self.affectView.alpha = sender.value;
   CGImageRelease(cgImage);

}

【问题讨论】:

  • 每次您从 self.affectView.image 获取图像并为其分配新图像时都在您的操作中。因此,每次您获得新图像而不是原始图像时。您需要为原始图像添加效果,而不是更新后的图像。我已添加 ans 供您参考。

标签: ios objective-c uiimageview core-image luminance


【解决方案1】:

只需复制要添加过滤器的图像并将其放在一边。为复制的图像添加效果并将它们显示在您的 _affectView 图像视图中。

每次在您的滑块操作中获取原始图像的参考并对该图像产生影响,而不是从图像视图中获取图像。

将全局变量创建为 mainImage 为

UIImage *mainImage;

在您的 viewDidLoad 中将原始图像分配给您的主图像

mainImage = [UIImage imagenamed:"yourMainImage"]; // assign from source local or url

在每个滑块动作上的 IBAction 中,获取原始图像的引用,而不是从 imageview 获取图像。

- (IBAction)actionSharp:(UISlider *)sender {
UIImage *demoImage = mainImage;
CIImage* image = [CIImage imageWithCGImage:demoImage.CGImage];
CIContext *context = [CIContext contextWithOptions:nil];
NSNumber *testNSNumber = [NSNumber numberWithFloat:_sharpActionWithSlider.value];
NSLog(@"ffghhn %f",_sharpActionWithSlider.value);
CIFilter *gaussianBlurFilter = [CIFilter filterWithName:@"CISharpenLuminance" keysAndValues: @"inputImage", image, nil];

[gaussianBlurFilter setDefaults];
[gaussianBlurFilter setValue:testNSNumber forKey:kCIInputSharpnessKey];
[gaussianBlurFilter setDefaults];
CIImage *result2 = [gaussianBlurFilter valueForKey:kCIOutputImageKey];
CGImageRef cgImage = [context createCGImage:result2 fromRect:[result2 extent]];
UIImage *sharp= [UIImage imageWithCGImage:cgImage];
UIImage *p = sharp;
self.affectView.image= p;
self.affectView.alpha = sender.value;
CGImageRelease(cgImage);
}

【讨论】:

    【解决方案2】:

    您从_affectView 获取演示图像,对其应用过滤器,然后再次将其保存在_affectView 中。下次您将_affectView 检索到 UIImage 中时,它将不是原始图像而是修改后的图像,因此无法恢复到原始图像。

    一开始(在此方法之外)将原始图像保存在demo 中,并随时修改demo

    【讨论】:

    • 如果我不将输出图像从过滤器分配给 imageview,如何显示过滤器对 imageview 的影响?
    • 您使用名为 demo 的全局变量,对其应用过滤器并将过滤后的图像分配给 imageview。您不必在每次要应用过滤器时都覆盖 demo,因为一旦应用过滤器,就不会返回到原始图像。
    • 在哪里将此演示图像分配给_affectView,以便我可以看到更改?
    • 在视图didLoad-demoimage = effectView.Image,在那张幻灯片改变之后,我会写到affectview.image = image
    • 我猜您正在选择要应用过滤器的图像的某个位置,如果没有更多代码,我不知道该怎么做,但在我看来,您选择要过滤的图像的位置或第一次将图像分配给 imageview 的位置是保存demo 的最佳选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多