2015-10-29 4 views
0

Я пытаюсь воссоздать в C#, серию фильтров фотошоп. Есть конкретный взгляд, который я хочу дать изображению, которое я нашел в учебнике для фотошоп. Я создаю программу, которая делает это автоматически.C# Экранная смесь с непрозрачностью

Я нахожусь на шаге, где мне нужно, чтобы начертить сочетание двух цветов, которые я могу сделать. Проблема, с которой я сталкиваюсь, - это удалить непрозрачность только фильтра до 30%, и я не уверен, как вычислить все это вместе.

Я могу сделать экран между двумя цветами. Я могу сделать альфа между двумя цветами.

В Photoshop они: 1. создать слой (горизонтальные белые линии с альфа) 2. Нанести слой к изображению с экраном смесью 3. Добавить 30% непрозрачность в одиночку, чтобы слой, который уменьшает эффект экрана ,

Я не знаю, как вычислить ту полную непрозрачность. Я предполагаю, что мне нужно, чтобы некоторые уменьшили эффект экрана на 70% за непрозрачность 30%, но это не кажется совершенно правильным.

Если кто-нибудь может помочь мне с порядком работы, который был бы замечательным!

+0

Вы спрашиваете конкретно о помощи в фотошопе? Этот сайт подходит для программирования, разрабатываете ли вы фильтр или просто хотите помочь с PS? –

+0

Я делаю все это в C#. Я отредактирую вопрос, чтобы быть более ясным. – Terrordoll

+0

Изменены ли ваши эффекты на пиксельной основе? Тогда разница должна быть только 70%, не так ли? Таким образом, новые и старые значения будут смешанными/смешанными в этой пропорции? – TaW

ответ

0

Я начал просто пробовать вещи и заканчивал тем, что кажется близким, если не точным.

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

Три верхних строчек являются уместна кодой из внутри цикла, переборе пикселей в растровом изображении.

Надеюсь, это поможет кому-то :)