2010-12-10 29 views
12

¿Alguien sabe cómo funcionan las capas de ajuste en Photoshop? Necesito generar una imagen de resultado que tenga una imagen de origen y valores de HSL de la capa de ajuste de Tono/Saturación. La conversión a RGB y luego la multiplicación con el color de origen no funciona.Algoritmo para la capa de ajuste de tono/saturación de Photoshop

¿O es posible reemplazar la capa de ajuste de tono/saturación con capas normales con los modos de fusión configurados adecuadamente (Mulitiply, Pantalla, Tono, Saturación, Color, Luminocity, ...)? Si es así, ¿cómo?

Gracias

Respuesta

3

Photoshop, dunno. Pero la teoría es generalmente: la imagen RGB se convierte a HSL/HSV por los métodos internos de la capa en particular; cada HSL de cada píxel se modifica según los parámetros especificados, y el resultado así obtenido se proporciona de nuevo (para mostrar) en RGB.

PaintShopPro7 solía dividir el espacio H (suponiendo un rango de 0..360) en incrementos discretos de 30 ° (IIRC), por lo que si solo golpeaba los "amarillos", es decir, solo los píxeles cuyo componente H se valoraba 45-75 se consideraría para la manipulación.

rojos 345..15, naranjas, amarillos 15..45 45..75, yellowgreen 75..105, verdes 105..135, etc.

 
if (h >= 45 && h < 75) 
     s += s * yellow_percent; 

Hay posibilidades alternativas, tales como la aplicación de un filtro de atenuación, como en:

 
/* For h=60, let m=1... and linearly fall off to h=75 m=0. */ 
m = 1 - abs(h - 60)/15; 
if (m < 0) 
     m = 0; 
s += s * yellow_percent * d; 
9

he-ingeniería inversa del cálculo para cuando la casilla de verificación "Colorear" está marcada. Todo el código siguiente es pseudo-código.

Las entradas son:

  • hueRGB, que es un color RGB para HSV(photoshop_hue, 100, 100).ToRGB()
  • saturación, que es photoshop_saturation/100.0 (es decir 0..1)
  • ligereza , que es photoshop_lightness/100.0 (es decir, -1..1)
  • valor, que es pixel.ToHSV().Value, escalado en el rango 0..1.

El método para colorear un solo píxel:

color = blend2(rgb(128, 128, 128), hueRGB, saturation); 

if (lightness <= -1) 
    return black; 
else if (lightness >= 1) 
    return white; 

else if (lightness >= 0) 
    return blend3(black, color, white, 2 * (1 - lightness) * (value - 1) + 1) 
else 
    return blend3(black, color, white, 2 * (1 + lightness) * (value) - 1) 

Dónde blend2 y blend3 son:

blend2(left, right, pos): 
    return rgb(left.R * (1-pos) + right.R * pos, same for green, same for blue) 

blend3(left, main, right, pos): 
    if (pos < 0) 
     return blend2(left, main, pos + 1) 
    else if (pos > 0) 
     return blend2(main, right, pos) 
    else 
     return main 
+0

Grandes, gracias por compartir . He jugado con tu código y parece que el resultado es un poco más brillante de lo esperado. Entonces me di cuenta de que suceda debido a esto la línea 2 * (1 + luminosidad) * (valor) - 1 y si no se multiplican (1 + luminosidad) * (valor) con 2 resuelve el problema. – user65721

+0

Gracias, buen trabajo! –

+0

¿Qué es 'rgb (128, 128, 128)' en la primera línea? ¿El rgb de color del píxel individual original? – zwcloud

3

he descubierto la manera levedad obras.

El parámetro de brillo de entrada b es en [0, 2], la producción es c (canal de color).

if(b<1) c = b * c; 
else c = c + (b-1) * (1-c); 

Algunas pruebas:

b = 0 >>> c = 0 // black 
b = 1 >>> c = c // same color 
b = 2 >>> c = 1 // white 

Sin embargo, si se elige un intervalo (por ejemplo Rojos en lugar de Maestro), ligereza se comporta de forma completamente diferente, más parecido a la saturación.

+0

Por b> 1, creo que c = 1 - (2-b) * (1-c) tiene más sentido. @Ivan Kuckir – lbsweek

+0

esta dos fórmula obtendrá el mismo resultado – lbsweek

1

Hola me escribió shader colorear y mi ecuación es como se va a la par

inputRGB es la imagen de la fuente que debe estar en blanco y negro

(r+g+b) * 0.333 

colorRGB es su color de destino
finalRGB es el resultado

pseudo código:

finalRGB = inputRGB * (colorRGB + inputRGB * 0.5); 

creo que es rápido y eficiente

0

Cuando la casilla de verificación “Colorear” está marcada, la ligereza de la capa subyacente se combina con los valores de los deslizadores de tono y saturación y convertido de HSL a RGB de acuerdo con las ecuaciones en https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSL. (El regulador de Luminosidad simplemente reasigna la ligereza a un subconjunto de la escala como se puede ver al observar el histograma, el efecto es bastante horrible y no veo por qué alguien pueda utilizarlo.)

Cuestiones relacionadas