首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CIColorMatrix滤波器在Swift中的应用

CIColorMatrix滤波器在Swift中的应用
EN

Stack Overflow用户
提问于 2015-05-02 03:14:11
回答 1查看 2.8K关注 0票数 5

下面的Swift功能应该使用指定的‘tintColor’来着色灰度图像'greyImage‘:

代码语言:javascript
复制
import UIKit

func colorizeImage(greyImage : UIImage, tintColor : UIColor) -> UIImage? {

    let colorMatrixFilter = CIFilter(name: "CIColorMatrix")

    var r:CGFloat = 0
    var g:CGFloat = 0
    var b:CGFloat = 0
    var a:CGFloat = 0
    tintColor.getRed(&r, green:&g, blue:&b, alpha:&a)

    colorMatrixFilter.setDefaults()
    colorMatrixFilter.setValue(greyImage, forKey:"inputImage") //kCIInputImageKey)
    colorMatrixFilter.setValue(CIVector(x:r, y:0, z:0, w:0), forKey:"inputRVector")
    colorMatrixFilter.setValue(CIVector(x:0, y:g, z:0, w:0), forKey:"inputGVector")
    colorMatrixFilter.setValue(CIVector(x:0, y:0, z:b, w:0), forKey:"inputBVector")
    colorMatrixFilter.setValue(CIVector(x:0, y:0, z:0, w:a), forKey:"inputAVector")

    if let ciImage =  colorMatrixFilter.outputImage {
        return UIImage(CIImage: ciImage);
    }

    return nil;
}

颜色是UIColor.orangeColor() (r=1,g=0.5,b=0,a=1),灰度图像是可以的,因为当输入到ImageView时,它会显示得很好。

看起来所有必需的键都提供了,键分配也很顺利(BTW检查键的有效性,还是接受所有内容?),但是,读“outputImage”属性会产生SIGABRT和以下控制台消息:

代码语言:javascript
复制
2015-05-02 13:04:07.319 MyApp[436:8241] -[UIImage _internalRepresentation]: unrecognized selector sent to instance 0x7fd5b3ca82b0
2015-05-02 13:04:07.629 MyApp[436:8241] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage _internalRepresentation]: unrecognized selector sent to instance 0x7fd5b3ca82b0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001087abf35 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010a56cbb7 objc_exception_throw + 45
    2   CoreFoundation                      0x00000001087b304d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010870b27c ___forwarding___ + 988
    4   CoreFoundation                      0x000000010870ae18 _CF_forwarding_prep_0 + 120
    5   CoreImage                           0x0000000108bd30fe -[CIColorMatrix outputImage] + 885
    6   MyApp                            0x00000001085c182d _TF8MyApp13colorizeImageFTCSo7UIImageCSo7UIColor_GSqS0__ + 4733
    7   MyApp                            0x00000001085c2b59 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-02 03:42:22

问题是CIColorMatrix需要参数inputImage,它应该是CIImage对象,而不是UIImage (greyImage)。

更新:Swift 3或更高版本

代码语言:javascript
复制
extension UIColor {
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)? {
        var (r,g,b,a): (CGFloat,CGFloat,CGFloat,CGFloat) = (0,0,0,0)
        return getRed(&r, green: &g, blue: &b, alpha: &a) ? (r,g,b,a) : nil
    }
}
代码语言:javascript
复制
extension CIImage {
    var image: UIImage { .init(ciImage: self) }
    func colorized(with color: UIColor) -> CIImage? {
        guard
            let (r,g,b,a) = color.rgba,
            let colorMatrix = CIFilter(name: "CIColorMatrix",
                parameters: ["inputImage":  self,
                             "inputRVector": CIVector(x: r, y: 0, z: 0, w: 0),
                             "inputGVector": CIVector(x: 0, y: g, z: 0, w: 0),
                             "inputBVector": CIVector(x: 0, y: 0, z: b, w: 0),
                             "inputAVector": CIVector(x: 0, y: 0, z: 0, w: a)])
        else { return nil }
        return colorMatrix.outputImage
    }
}
代码语言:javascript
复制
extension UIImage {
    var coreImage: CIImage? { CIImage(image: self) }
    func colorized(with color: UIColor) -> UIImage? {
        coreImage?.colorized(with: color)?.image
    }
}

操场测试:

代码语言:javascript
复制
let profilePicture = UIImage(data: try! Data(contentsOf: URL(string: "http://i.stack.imgur.com/Xs4RX.jpg")!))!
profilePicture.colorized(with: .orange)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29997985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档