首页 文章

C#Screen Blend具有不透明度

提问于
浏览
0

我试图在C#中重新创建一系列的photoshop过滤器 . 有一个特定的外观我想给我在photoshop教程中找到的图像 . 我正在创建一个自动执行此操作的程序 .

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

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

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

我不知道如何计算最终的不透明度 . 我的猜测是,我需要一些如何将屏幕的效果降低70%,以达到30%的不透明度,但这似乎不太合适 .

如果有人能帮助我完成一个令人敬畏的操作顺序!

1 回答

  • 0

    我开始尝试解决这个问题,结果就是这个,如果不准确的话,这似乎很接近 .

    • 屏幕混合基础图像和叠加图像,并将结果保存到新位置 .

    • 正常将基本图像与屏幕混合的乘积混合 .

    • 处理叠加层和产品 .

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

    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);
        }
    

    前三行是循环内的相关代码,迭代位图中的像素 .

    希望这有助于某人:)

相关问题