CIHistogramDisplayFilter 上的 Objective-C 到 Swift 转换问题

标签 objective-c xcode swift histogram ciimage

我有这段代码片段可以在 Objective-C 中显示直方图,效果很好。但是,我很难将它转换为 Swift。

Objective-C

//Show Histogram
        CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
        CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary *)attachments];


        NSUInteger count = 256;
        count = count <= 256 ? count : 256;
        count = count >= 1 ? count : 1;


        NSDictionary *params = @{kCIInputImageKey: ciImage,
                                 kCIInputExtentKey: [CIVector vectorWithCGRect:[ciImage extent]],
                                 @"inputCount": @(256), @"inputScale": @(200)
                                 };

        CIFilter *filter = [CIFilter filterWithName:@"CIAreaHistogram"
                                withInputParameters:params];


        CIImage *outImage = [filter outputImage];
    //---------------------------------------------

        CIContext *context = [CIContext contextWithOptions:nil];

        NSDictionary *params2 = @{
                                  kCIInputImageKey: outImage
                                  };
        CIFilter *filter2 = [CIFilter filterWithName:@"CIHistogramDisplayFilter"
                                 withInputParameters:params2];

        CIImage *outputImage = [filter2 outputImage];
        CGRect outExtent = [outputImage extent];
        CGImageRef cgImage = [context createCGImage:outputImage
                                           fromRect:outExtent];

        UIImage *outImage2 = [UIImage imageWithCGImage:cgImage];
        CGImageRelease(cgImage);

        // resize
        UIImage *resized = [self resizeImage:outImage2
                                 withQuality:kCGInterpolationNone
                                        rate:2.5];
        //Remove the default grey background
        resized = [self removeColorFromImage:resized grayLevel:137];

        dispatch_async(dispatch_get_main_queue(),
        ^{
            self.histogramView.image = resized;
        });

在将它转换为 Swift 时,我开始遇到这些错误:

    var pixelBuffer: CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)!
    var attachments: CFDictionaryRef = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate)!
    var ciImage: CIImage = CIImage(cVPixelBuffer: pixelBuffer, options: (attachments as! [NSObject : AnyObject]))

最后一行给出了错误:

Argument labels '(cVPixelBuffer:, options:)' do not match any available overloads

最佳答案

//Show Histogram -- Swift version
    var pixelBuffer: CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)!
    var attachments: CFDictionaryRef = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate)!
    var ciImage: CIImage = CIImage(CVPixelBuffer: pixelBuffer, options: attachments as? [String : AnyObject])

    var count = 256
    count = count <= 256 ? count : 256
    count = count >= 1 ? count : 1

    let params = [kCIInputImageKey: ciImage,
        kCIInputExtentKey:CIVector.init(CGRect: ciImage.extent),
        "inputCount":256, "inputScale":200]

    let filter:CIFilter! = CIFilter(name: "CIAreaHistogram" , withInputParameters: params)


    let outImage: CIImage = (filter?.outputImage)!
    //---------------------------------------------

    let context:CIContext = CIContext(options: nil)

    let params2 = [kCIInputImageKey: outImage]


    let filter2 = CIFilter(name: "CIHistogramDisplayFilter",withInputParameters: params2)

    let outputImage:CIImage = filter2!.outputImage!
    let outExtent:CGRect = outputImage.extent

    let cgImage:CGImageRef = context.createCGImage(outputImage, fromRect: outExtent)

    let outImage2:UIImage = UIImage(CGImage: cgImage)

    // resize

    let resized:UIImage = self.resizeImage(outImage2,withQuality:CGInterpolation.None,rate:2.5)

    //Remove the default grey background

    resized = self.removeColorFromImage(resized, grayLevel:137)


    dispatch_async(dispatch_get_main_queue()) {
        self.histogramView.image = resized
    }

关于CIHistogramDisplayFilter 上的 Objective-C 到 Swift 转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36987382/

相关文章:

objective-c - NSURLConnection 异步上传文件?

objective-c - 如何在我的 OS X 应用程序中以编程方式运行 applescript (.scpt)?

ios - xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

objective-c - SIGABRT fatal error

ios - UICollectionViewCell是否仅在 View 上加载?

objective-c - 在 iOS 中转换 UIView 时遇到问题

ios - 从摄像头或库中选择多个 ImageView 的图像

ios - 多值设置未使用默认值初始化

ios - 自定义 Firebase 数据服务类 : Swift 3

swift - Switch 语句必须详尽 - Xcode 错误?