【问题标题】:How to multiply a color to an image in Swift?如何在 Swift 中将颜色与图像相乘?
【发布时间】:2020-06-09 15:37:05
【问题描述】:

我对将我的应用从 Android 迁移到 iOS 提出了其他疑问(我认为这更困难......)。

好的,所以在这种情况下,我尝试为下一张图片着色:

在 Android 中我使用了下一个代码:

public static Bitmap doNalaFilter (Bitmap src) {
     Bitmap bmBrown0 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig());
     Canvas cBrown0 = new Canvas(bmBrown0);
     Paint paintBrown0 = new Paint();
     paintBrown0.setColorFilter(new LightingColorFilter(Color.WHITE, 0x800000));
     cBrown0.drawBitmap(bmTemp, 0, 0, paintBrown0);
     Bitmap bmBrown = Bitmap.createBitmap(src.getWidth(), src.getHeight(), src.getConfig());
     Canvas cBrown = new Canvas(bmBrown);
     cBrown.drawBitmap(src, 0, 0, null);
     Paint paintBrown = new Paint();
     paintBrown.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
     cBrown.drawBitmap(bmBrown0, 0, 0, paintBrown);
     return bmBrown;
}

获取下一张图片:

但在 Swift 中,我正在尝试下一个代码:

func nalaFilter() -> UIImage? {
        let inImage = CIImage (image: self)
        let SRGBImage = inImage?.applyingFilter("CILinearToSRGBToneCurve")

        dynamic let brownMatrix = CIFilter (name: "CIMultiplyBlendMode")

        let brownRect = CGRect (
            x: (SRGBImage?.extent.origin.x)!,
            y: (SRGBImage?.extent.origin.y)!,
            width: (SRGBImage?.extent.size.width)!,
            height: (SRGBImage?.extent.size.height)!)
        let brownColor = CIColor (red: 128.0/255.0, green: 0.0, blue: 0.0)
        let brownOverlay = CIImage (color: brownColor)
        let brownCroppedImage = brownOverlay.cropped(to: brownRect)
        brownMatrix?.setValue(SRGBImage, forKey: kCIInputImageKey)
        brownMatrix?.setValue(brownCroppedImage, forKey: kCIInputBackgroundImageKey)
        let brownOutImage = brownMatrix?.outputImage

        let linearImage = brownOutImage?.applyingFilter("CISRGBToneCurveToLinear")

        let cgImage = CIContext().createCGImage(linearImage!, from: linearImage!.extent)
        return UIImage (cgImage: cgImage!)
}

我得到了这个!

有人知道一个 Swift 代码可以以与 Android 中相同的方式工作吗?

提前致谢!

【问题讨论】:

  • 我不知道 Android 代码,但在 Swift 版本中,通过乘以 (0.5, 0, 0) 你完全杀死了绿色和蓝色通道。也许你想要 (0.5, 1, 1)?
  • 也不确定 sRGB-to-linear。线性图像通常看起来很暗。
  • 嗨,bg2b,谢谢你的回答,但这不是我想要的......

标签: swift xcode image-processing cifilter porter-duff


【解决方案1】:

最后我得到了解决我问题的下一个代码:

func nalaFilter() -> UIImage? {
        let brownColor = CIColor (red: 128.0/255.0, green: 0.0, blue: 0.0)
        let brownRect = CGRect (origin: .zero, size: self.size)

        //Colored image
        UIGraphicsBeginImageContextWithOptions(brownRect.size, true, 0.0)
        brownColor.setFill()
        UIRectFill(brownRect)
        let brownColoredImage = UIGraphicsGetImageFromCurrentImageContext()
        let brownContext = UIGraphicsGetCurrentContext()
        brownContext!.setFillColor(UIColor.white.cgColor)
        brownContext!.fill(brownRect)
        self.draw(in: brownRect, blendMode: .normal, alpha: 1)
        brownColoredImage?.draw(in: brownRect, blendMode: .colorDodge, alpha: 1)
        let outBrown0Image = UIGraphicsGetImageFromCurrentImageContext()

        //Multiplied image
        self.draw(in: brownRect, blendMode: .normal, alpha: 1)
        outBrown0Image?.draw(in: brownRect, blendMode: .multiply, alpha: 1)
        let outBrownImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return outBrownImage
}

这得到的结果与我的 Android 完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2018-10-28
    相关资源
    最近更新 更多