【问题标题】:CSS grayscale filter and background-blend-mode at same time?CSS灰度过滤器和背景混合模式同时?
【发布时间】:2014-11-08 07:20:11
【问题描述】:

我正在尝试以与在 Photoshop 文件中相同的方式处理图像 - 将图像去饱和为灰度,然后使用多重混合模式应用颜色叠加。为此,我正在设计一个 CSS 背景图像...

.someclass
{
    /* grayscale */
    -webkit-filter: grayscale(1); 
    filter: gray; 
    filter: grayscale(1);
    filter: url(desaturate.svg#greyscale);

    /* multiply */
    background-color: rgba(190, 50, 50, 0.65);
    background-blend-mode: multiply;
}

这样做的问题是灰度滤镜最终会降低混合模式下的红色饱和度。换句话说,乘法首先发生,然后是灰度。如何切换,先应用灰度,再应用混合模式?

我为代码创建了一个小提琴 (http://jsfiddle.net/g54LcoL1/1/) 和一个屏幕截图(在 Photoshop 中制作),我希望小提琴结果看起来像。最底部的图像div.grayscale.multiply 应为红色。

【问题讨论】:

  • 这在 CSS AFAIK 中是不可能的。这是因为 CSS 在矩阵中执行所有操作,因此设置了所有属性的顺序。替代方法是事先将图像保存为灰度,或者使用类似画布的东西来做一个,然后另一个
  • 作为 CSS 的“用户”,在我看来,这应该发生的方式是它在代码中声明的顺序。我确信它是有原因的,但随着background-blend-mode 得到更广泛的支持,人们将要求更多地控制混合/过滤器的顺序。我想canvas 是要走的路。我试试看。
  • Css 是自下而上的语言,也许那是你的问题,我不知道。无论如何尝试 Pleeeease Playground 它转换过滤器。
  • 从来没有-moz前缀filter属性。从问题中删除它......

标签: css background css-filters background-blend-mode


【解决方案1】:

混合模式应用于背景层,然后过滤器应用于整个元素,所以它们有点处理两个不同的事情:在计算背景时(包括红色外观),整个元素通过滤镜转为灰度。

有一个建议的 filter() 函数用于图像引用,因此理论上,您应该能够在加载任何图像时对其应用过滤器。我认为是这样的:

.someclass {
    background-image: filter(cat.jpg, grayscale(100%));
    background-color: red;
    background-blend-mode: multiply;
}

遗憾的是,我认为这还没有在任何地方实现,它只是在过滤器规范的草稿版本中。

一般来说,这些“后处理”CSS 效果类型的操作顺序与 SVG 的定义顺序相同: 首先进行过滤,然后进行剪辑,然后进行遮罩,然后进行混合。

(见Blending & Compositing Spec.)所以,恐怕你无法改变它。

【讨论】:

    【解决方案2】:

    你不能用过滤器来做,但你可以用混合模式来做所有事情

    混合中的灰度等效是亮度,图像作为源,纯白色作为背景

    所以背景图片,从下到上,是:

    1. 白色(作为背景色)
    2. 你的形象
    3. 纯红色(现在必须指定为渐变)

    混合模式是亮度和乘法

    .test {
      width: 400px;
      height: 400px;
      background-image: linear-gradient(0deg, red, red), url("http://cuteoverload.files.wordpress.com/kitteh_puddle-1312.jpg");
      background-color: white;
      background-blend-mode: multiply, luminosity;
      background-size: cover;
    }
    <div class="test"></div>

    【讨论】:

    • 这样一个很棒的解决方案。如果 Safari 支持亮度背景混合模式,我现在就在天堂。
    • 我实际上甚至在 Safari 中使用照片上的mix-blend-mode 属性和filter: grayscale(100%) 也能正常工作。哇! css-tricks.com/almanac/properties/m/mix-blend-mode
    【解决方案3】:

    正如乔尔在接受的答案下的评论中提到的那样,可以使用mix-blend-mode 来做到这一点。

    在我的示例中,我将使用实际图像而不是背景图像。如果它必须是背景图像,那么您仍然可以使用相同的技术。只需将图像替换为具有背景图像样式的空 div。

    另外,我将使用“屏幕”混合模式而不是“正片叠底”,因为它更清楚地展示了颜色去除。

    去除颜色:

    .image-wrapper {
        background: red;
        display: inline-block;
    }
    
    .image-wrapper img {
        mix-blend-mode: screen;
        filter: grayscale(100%);
    }
    <div class="image-wrapper">
        <img src="https://static.decalgirl.com/assets/designs/large/clrkit.jpg" alt="Colorful cats"/>
    </div>

    不去除颜色:

    .image-wrapper {
        background: red;
        display: inline-block;
    }
    
    .image-wrapper img {
        mix-blend-mode: screen;
    }
    <div class="image-wrapper">
        <img src="https://static.decalgirl.com/assets/designs/large/clrkit.jpg" alt="Colorful cats"/>
    </div>

    更多信息可以在这里找到:

    https://css-tricks.com/almanac/properties/m/mix-blend-mode/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2021-11-22
      • 2020-07-10
      • 2021-07-25
      • 1970-01-01
      • 2013-04-26
      • 2021-01-30
      相关资源
      最近更新 更多