2012-04-05 35 views
27

Tôi đang sử dụng Hình ảnh lõi và muốn tạo hiệu ứng đen trắng trên hình ảnh đã chọn.Bộ lọc hình ảnh lõi tốt nhất để tạo ra hiệu ứng đen trắng là gì?

Lý tưởng nhất là tôi muốn có quyền truy cập vào cùng một loại tùy chọn có sẵn trên Photoshop, ví dụ: Red, Cyan, Greens, Blues và Magenta. Mục đích là tạo ra các loại hiệu ứng đen trắng khác nhau.

Có ai biết bộ lọc nào là tốt nhất để thao tác các loại tùy chọn này không? Nếu không ai biết cách tiếp cận tốt để tạo hiệu ứng đen trắng bằng các bộ lọc khác?

Cảm ơn

Oliver

Trả lời

54
- (UIImage *)imageBlackAndWhite 
{ 
    CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; 

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; 
    CIImage *output = [CIFilter filterWithName:@"CIExposureAdjust" keysAndValues:kCIInputImageKey, blackAndWhite, @"inputEV", [NSNumber numberWithFloat:0.7], nil].outputImage; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; 
    //UIImage *newImage = [UIImage imageWithCGImage:cgiimage]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:image.scale orientation:image.imageOrientation]; 
    CGImageRelease(cgiimage); 

    return newImage; 
} 

UPD .: Đối iOS6CIColorMonochrome lọc, nhưng tôi chơi với nó và thấy nó không tốt như vậy như tôi.

+0

Vui mừng giúp :) – Shmidt

+1

Nếu có ai quan tâm. Tôi đã sử dụng nó tại đây https://github.com/codler/Battery-Time-Remaining/commit/4d0ce73d7b1e954fefba7cbda339b67d77a405d0 – Codler

+0

Nó không hoạt động trong OS X 10.10 Yosemite nữa = ( – Codler

7

Để tạo một hiệu ứng đơn sắc tinh khiết, tôi đã sử dụng CIColorMatrix với R, G và các thông số vector B tất cả các thiết lập để (0,2125, 0,7154, 0,0721, 0), và các vectơ alpha và thiên vị còn lại với các giá trị mặc định của chúng.

Giá trị là hệ số chuyển đổi RGB sang thang độ xám Tôi đã tra cứu trên internets tại một số điểm. Bằng cách thay đổi các hệ số này, bạn có thể thay đổi sự đóng góp của các kênh đầu vào. Bằng cách chia tỷ lệ mỗi bản sao của vectơ, và tùy ý thiết lập một vector thiên vị, bạn có thể thu nhận kết quả đầu ra.

13

đây là ví dụ với CIColorMonochrome

- (UIImage *)imageBlackAndWhite 
{ 
    CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; 

    CIImage *output = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, beginImage, @"inputIntensity", [NSNumber numberWithFloat:1.0], @"inputColor", [[CIColor alloc] initWithColor:[UIColor whiteColor]], nil].outputImage; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:self.scale orientation:self.imageOrientation]; 

    CGImageRelease(cgiimage); 

    return newImage; 
} 
+0

'inputIntensity' là' 1' theo mặc định, không cần và nó theo cách thủ công. –

4

liên quan đến các câu trả lời gợi ý để sử dụng CIColorMonochrome Với: Hiện nay có một vài bộ lọc màu xám chuyên dụng có sẵn từ iOS7 (và OS X 10.9):

  • CIPhotoEffectTonal

    bắt chước phim chụp ảnh đen trắng mà không làm thay đổi đáng kể độ tương phản.

  • CIPhotoEffectNoir:

    bắt chước phim chụp ảnh đen trắng với độ tương phản quá mức

Nguồn: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html

4

Dưới đây là giải pháp đánh giá hàng đầu chuyển đổi sang Swift (iOS 7 trở lên):

func blackAndWhiteImage(image: UIImage) -> UIImage { 
    let context = CIContext(options: nil) 
    let ciImage = CoreImage.CIImage(image: image)! 

    // Set image color to b/w 
    let bwFilter = CIFilter(name: "CIColorControls")! 
    bwFilter.setValuesForKeysWithDictionary([kCIInputImageKey:ciImage, kCIInputBrightnessKey:NSNumber(float: 0.0), kCIInputContrastKey:NSNumber(float: 1.1), kCIInputSaturationKey:NSNumber(float: 0.0)]) 
    let bwFilterOutput = (bwFilter.outputImage)! 

    // Adjust exposure 
    let exposureFilter = CIFilter(name: "CIExposureAdjust")! 
    exposureFilter.setValuesForKeysWithDictionary([kCIInputImageKey:bwFilterOutput, kCIInputEVKey:NSNumber(float: 0.7)]) 
    let exposureFilterOutput = (exposureFilter.outputImage)! 

    // Create UIImage from context 
    let bwCGIImage = context.createCGImage(exposureFilterOutput, fromRect: ciImage.extent) 
    let resultImage = UIImage(CGImage: bwCGIImage, scale: 1.0, orientation: image.imageOrientation) 

    return resultImage 
} 
2

Dưới đây là câu trả lời thích nhất từ ​​@Shmidt viết như một phần mở rộng UIImage với một cập nhật hiệu suất trong Swift:

import CoreImage 

extension UIImage 
{ 
    func imageBlackAndWhite() -> UIImage? 
    { 
     if let beginImage = CoreImage.CIImage(image: self) 
     { 
      let paramsColor: [String : AnyObject] = [kCIInputBrightnessKey: NSNumber(double: 0.0), 
                kCIInputContrastKey: NSNumber(double: 1.1), 
                kCIInputSaturationKey: NSNumber(double: 0.0)] 
      let blackAndWhite = beginImage.imageByApplyingFilter("CIColorControls", withInputParameters: paramsColor) 

      let paramsExposure: [String : AnyObject] = [kCIInputEVKey: NSNumber(double: 0.7)] 
      let output = blackAndWhite.imageByApplyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) 

      let processedCGImage = CIContext().createCGImage(output, fromRect: output.extent) 
      return UIImage(CGImage: processedCGImage, scale: self.scale, orientation: self.imageOrientation) 
     } 
     return nil 
    } 
} 
0

MacOS (NSImage) Swift 3 phiên bản của @ chuyển @ câu trả lời Shmidt của FBente của:

extension NSImage 
{ 
    func imageBlackAndWhite() -> NSImage? 
    { 
     if let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) 
     { 
      let beginImage = CIImage.init(cgImage: cgImage) 
      let paramsColor: [String : AnyObject] = [kCIInputBrightnessKey: NSNumber(value: 0.0), 
                kCIInputContrastKey: NSNumber(value: 1.1), 
                kCIInputSaturationKey: NSNumber(value: 0.0)] 
      let blackAndWhite = beginImage.applyingFilter("CIColorControls", withInputParameters: paramsColor) 

      let paramsExposure: [String : AnyObject] = [kCIInputEVKey: NSNumber(value: 0.7)] 
      let output = blackAndWhite.applyingFilter("CIExposureAdjust", withInputParameters: paramsExposure) 

      if let processedCGImage = CIContext().createCGImage(output, from: output.extent) { 
       return NSImage(cgImage: processedCGImage, size: self.size) 
      } 
     } 
     return nil 
    } 
} 
0

Tôi đã thử giải pháp Shmidt nhưng có vẻ như tôi quá hiển thị trên iPad Pro. Tôi chỉ đang sử dụng phần đầu tiên của giải pháp của mình mà không có bộ lọc phơi nhiễm:

- (UIImage *)imageBlackAndWhite 
{ 
    CIImage *beginImage = [CIImage imageWithCGImage:self.CGImage]; 

    CIImage *blackAndWhite = [CIFilter filterWithName:@"CIColorControls" keysAndValues:kCIInputImageKey, beginImage, @"inputBrightness", [NSNumber numberWithFloat:0.0], @"inputContrast", [NSNumber numberWithFloat:1.1], @"inputSaturation", [NSNumber numberWithFloat:0.0], nil].outputImage; 
    CIImage *output = [blackAndWhite valueForKey:@"outputImate"]; 

    CIContext *context = [CIContext contextWithOptions:nil]; 
    CGImageRef cgiimage = [context createCGImage:output fromRect:output.extent]; 
    //UIImage *newImage = [UIImage imageWithCGImage:cgiimage]; 
    UIImage *newImage = [UIImage imageWithCGImage:cgiimage scale:image.scale orientation:image.imageOrientation]; 
    CGImageRelease(cgiimage); 

    return newImage; 
} 
Các vấn đề liên quan