【问题标题】:Change NSImage brightness using NSSlider使用 NSSlider 更改 NSImage 亮度
【发布时间】:2018-10-31 22:33:26
【问题描述】:

我正在开发简单的图像处理应用程序,这是我更改NSImage亮度的不成功尝试:

- (IBAction)brightnessSlider:(NSSlider*)sender {

    ViewController *controller = (ViewController*)[NSApplication sharedApplication].keyWindow.contentViewController;
    controller.imageView.image = originalImage;
    CIImage* const beginImage = [self fromNSImageToCIImage:originalImage];
    filter = [CIFilter filterWithName:@"CIColorControls" keysAndValues: kCIInputImageKey, beginImage, kCIInputBrightnessKey, [sender doubleValue], nil];
    self->filteredImage = self->filter.outputImage;
    controller.imageView.image = [self fromCIImageToNSImage:filteredImage];

}

这里是fromNSImageToCIImagefromCIImageToNSImage的实现:

- (NSImage *)fromCIImageToNSImage:(CIImage *)inputImage {
    struct CGImage *cg = [context createCGImage:inputImage fromRect:[inputImage extent]];
    NSImage *finalImage = [[NSImage alloc] initWithCGImage:cg size:NSZeroSize];
    return finalImage;
}

- (CIImage *)fromNSImageToCIImage:(NSImage *)inputImage {
    struct CGImage *cg = [inputImage CGImageForProposedRect: nil context: nil hints: nil];
    CIImage *temp = [[CIImage alloc] initWithCGImage: cg options: nil];
    return temp;
}

这是处理这个问题的正确方法吗?我什至不知道什么不起作用。谢谢。

已编辑(我重写了代码,发件人值有问题):

- (IBAction)brightnessSlider:(NSSlider*)sender {
    ViewController *controller = (ViewController*)[NSApplication sharedApplication].keyWindow.contentViewController;
    CIImage* const beginImage = [self fromNSImageToCIImage:controller.imageView.image];
    CIFilter *brightness = [CIFilter filterWithName:@"CIColorControls" keysAndValues: kCIInputImageKey, beginImage, @"inputBrightness", [sender doubleValue], nil];
    CIImage *outputImage = brightness.outputImage;
    struct CGImage* cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
    NSImage *newImage = [[NSImage alloc] initWithCGImage:cgimg size:NSZeroSize];
    controller.imageView.image = newImage;
}

使用 NSSlider 时它会崩溃 - 在这一行中:CIFilter *brightness = [CIFilter filterWithName:@"CIColorControls" keysAndValues: kCIInputImageKey, beginImage, @"inputBrightness", [sender doubleValue], nil];

调试器显示:线程 1:EXC_BAD_ACCESS (code=1, address=0x6fbbba08)

【问题讨论】:

  • 你能告诉更多关于“不工作”的信息吗?
  • [sender doubleValue] 似乎有问题,至少这是我的应用程序在重写时崩溃的部分。我像这样重写了代码-(已编辑)。 NSSlider 的值也在 -1 和 1 之间。
  • 当我将@"inputBrightness" 键切换到常量 f.e. @0.1 它工作正常。
  • 使用[sender objectValue] 代替[sender doubleValue],这是NSNumber

标签: objective-c xcode macos cocoa


【解决方案1】:

将故障线路更改为:CIFilter *brightness = [CIFilter filterWithName:@"CIColorControls" keysAndValues: kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:[sender floatValue]], nil]; 完成了这项工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多