【问题标题】:C# Screen Blend with opacityC# 屏幕混合与不透明度
【发布时间】:2015-10-29 20:07:22
【问题描述】:

我正在尝试在 C# 中重新创建一系列 Photoshop 滤镜。我想为我在 Photoshop 教程中找到的图像赋予特定的外观。我正在创建一个自动执行此操作的程序。

我正处于一个必须筛选混合两种颜色的步骤中,这是我能够做到的。我遇到的问题是我需要将过滤器的不透明度降低到 30%,我不知道如何一起计算。

我可以在两种颜色之间做屏幕。 我可以在两种颜色之间做 alpha。

在 Photoshop 中: 1.创建一个图层(带alpha的水平白线) 2. 使用屏幕混合将图层应用到图像 3. 单独为图层添加 30% 的不透明度,以减少屏幕效果。

我不知道如何计算最终的不透明度。我的猜测是我需要一些如何将屏幕的效果降低 70% 以获得 30% 的不透明度,但这似乎不太正确。

如果有人可以帮助我完成操作顺序,那就太棒了!

【问题讨论】:

  • 您是否专门在 Photoshop 中寻求帮助?这个网站迎合编程,您是在开发过滤器,还是只想在 PS 方面寻求帮助?
  • 我在 c# 中做这一切。我将编辑问题以使其更清楚。
  • 您的效果是否逐个像素地变化?那你应该只有70%的差异吧?那么新旧值会按这个比例混合/混合吗?

标签: c# image-processing photoshop alpha blending


【解决方案1】:

我刚开始只是尝试一下,最后得到了这个,如果不准确的话,这似乎很接近。

  1. 将基本图像与叠加图像混合屏幕并将结果保存到新位置。
  2. 正常混合基本图像与屏幕混合的产品。
  3. 处理覆盖层和产品。

现在想想,这似乎很明显,但这花了我几个小时的反复试验。如果有人有兴趣,这里有一些代码。

                        Color oldColor = Color.FromArgb(rgbValues[position + 2], rgbValues[position + 1], rgbValues[position]);                           
                        Color screenProduct = ScreenBlend(oldColor, white);
                        Color newColorScreen = CalculateColorWithAlpha(oldColor, screenProduct, .30f);

    public Color ScreenBlend(Color Base, Color Overlay)
    {
        var float_Red = 1 - (1 - RGB_ByteToFloat(Base.R)) * (1 - RGB_ByteToFloat(Overlay.R));
        var float_Green = 1 - (1 - RGB_ByteToFloat(Base.G)) * (1 - RGB_ByteToFloat(Overlay.G));
        var float_Blue = 1 - (1 - RGB_ByteToFloat(Base.B)) * (1 - RGB_ByteToFloat(Overlay.B));

        var byte_Red = RGB_FloatToByte(float_Red);
        var byte_Green = RGB_FloatToByte(float_Green);
        var byte_Blue = RGB_FloatToByte(float_Blue);

        //this.ScreenColorBase.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(Base.R, Base.G, Base.B));
        //this.ScreenColorOverlay.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(Overlay.R, Overlay.G, Overlay.B));
        //this.ScreenColorResult.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(byte_Red, byte_Green, byte_Blue));
        //this.ScreenColorTarget.Background = new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(166, 168, 248));

        return Color.FromArgb(byte_Red, byte_Green, byte_Blue);
    }

    public Color CalculateColorWithAlpha(Color Base, Color Over, float Alpha)
    {
        var finalRed = Alpha * Over.R + (1 - Alpha) * Base.R;
        var finalGreen = Alpha * Over.G + (1 - Alpha) * Base.G;
        var finalBlue = Alpha * Over.B + (1 - Alpha) * Base.B;

        return Color.FromArgb((int)finalRed, (int)finalGreen, (int)finalBlue);
    }

前三行是循环中的相关代码,遍历位图中的像素。

希望这可以帮助某人:)

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 1970-01-01
    • 2013-12-01
    • 2021-02-18
    • 2017-03-31
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多