首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用强光传输模式使用UIGraphicsContext合成两个UIImages的可见工件

使用强光传输模式使用UIGraphicsContext合成两个UIImages的可见工件
EN

Stack Overflow用户
提问于 2018-07-23 10:38:20
回答 1查看 41关注 0票数 1

我正在使用UIGraphicsContext将两个UIImages合成在一起。

它在很大程度上是有效的,但使用强光CGBlendMode,我得到了奇怪的工件,如果我在Photoshop中使用强光转移模式,这些东西就不会出现。

我会尝试使用核心图像,但我需要能够控制顶层的不透明度被转移到硬光,据我所知,这是不可能的。

以下是使用UIGraphicsContext创建的图像:

这里它在Photoshop中使用相同的图层和不透明度:

下面是基本图像:

并使用硬光合成60%不透明度的层:

我尝试使用透明层将上下文插值质量设置为高质量,但没有任何改进。

我的代码如下。有没有人知道如何解决这个问题,或者用其他方法获得和我在Photoshop中一样的效果?

代码语言:javascript
复制
public extension UIImage {

    public func compImagesWithImage(_ topImg: UIImage, blendMode: CGBlendMode, opacity: CGFloat) -> UIImage? {

        let baseImg = self

        if let cgImage = baseImg.cgImage {
            let baseW = CGFloat(baseImg.cgImage!.width as size_t)
            let baseH = CGFloat(baseImg.cgImage!.height as size_t)

            UIGraphicsBeginImageContext(CGSize(width: baseW, height: baseH))
            if let context = UIGraphicsGetCurrentContext() {
                context.saveGState();
                context.interpolationQuality = .high

                let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: baseH)
                context.concatenate(flipVertical)

                context.setAlpha(1.0)
                context.setBlendMode(CGBlendMode.normal)
                context.draw(cgImage, in: CGRect(origin: CGPoint.zero, size: CGSize(width: CGFloat(baseW), height: CGFloat(baseH))))

                context.setAlpha(opacity)
                context.setBlendMode(blendMode)
                context.beginTransparencyLayer(auxiliaryInfo: nil)

                context.draw(topImg.cgImage!, in: CGRect(origin: CGPoint.zero, size: CGSize(width: CGFloat(baseW), height: CGFloat(baseH))))

                context.endTransparencyLayer()

                context.restoreGState();

                let finalImage = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()

                return finalImage

            }
        }

        return nil
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-07-23 10:56:01

这解决了这个问题:Higlight Artifacts When Using Hard Light Blend Mode

我只需要将基本层的alpha设置为0.99即可。

以下是更新后的代码:

代码语言:javascript
复制
public func compImagesWithImage(_ topImg: UIImage, blendMode: CGBlendMode, opacity: CGFloat) -> UIImage? {

    let baseImg = self

    if let cgImage = baseImg.cgImage {
        let baseW = CGFloat(baseImg.cgImage!.width as size_t)
        let baseH = CGFloat(baseImg.cgImage!.height as size_t)

        UIGraphicsBeginImageContext(CGSize(width: baseW, height: baseH))
        if let context = UIGraphicsGetCurrentContext() {
            context.saveGState();
            context.interpolationQuality = .high

            let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: baseH)
            context.concatenate(flipVertical)

            context.setAlpha(0.99)
            context.setBlendMode(CGBlendMode.normal)
            context.draw(cgImage, in: CGRect(origin: CGPoint.zero, size: CGSize(width: CGFloat(baseW), height: CGFloat(baseH))))

            context.setAlpha(opacity)
            context.setBlendMode(blendMode)
            context.beginTransparencyLayer(auxiliaryInfo: nil)

            context.draw(topImg.cgImage!, in: CGRect(origin: CGPoint.zero, size: CGSize(width: CGFloat(baseW), height: CGFloat(baseH))))

            context.endTransparencyLayer()

            context.restoreGState();

            let finalImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            return finalImage

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

https://stackoverflow.com/questions/51470979

复制
相关文章

相似问题

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