#!/usr/bin/env python
from gimpfu import *
def blend_if(img, drawable, this_layer_low, this_layer_high, underlying_layer_low, underlying_layer_high):
# Verifica se a imagem e a camada são válidas
if not pdb.gimp_item_is_valid(drawable):
return
# Obtém a camada atual
current_layer = pdb.gimp_image_get_active_layer(img)
# Obtém a camada subjacente
underlying_layer = None
for layer in img.layers:
if layer != current_layer:
underlying_layer = layer
break
if underlying_layer is None:
return
# Processa os pixels da camada atual e da camada subjacente
width = pdb.gimp_drawable_width(drawable)
height = pdb.gimp_drawable_height(drawable)
# Define o modo de processamento dos pixels
pdb.gimp_context_set_default_colors()
pdb.gimp_context_set_opacity(100)
pdb.gimp_context_set_paint_mode(GIMP_NORMAL_MODE)
# Itera sobre todos os pixels
for y in range(height):
for x in range(width):
pixel_current = pdb.gimp_drawable_get_pixel(current_layer, x, y)
pixel_underlying = pdb.gimp_drawable_get_pixel(underlying_layer, x, y)
# Converte os pixels para valores de cor (R, G, B)
r_current, g_current, b_current = pixel_current[0:3]
r_underlying, g_underlying, b_underlying = pixel_underlying[0:3]
# Calcula a luminância dos pixels
lum_current = 0.299 * r_current + 0.587 * g_current + 0.114 * b_current
lum_underlying = 0.299 * r_underlying + 0.587 * g_underlying + 0.114 * b_underlying
# Aplica a lógica do Blend-If
if this_layer_low <= lum_current <= this_layer_high and underlying_layer_low <= lum_underlying <= underlying_layer_high:
# Mistura os pixels
r_blend = int((r_current + r_underlying) / 2)
g_blend = int((g_current + g_underlying) / 2)
b_blend = int((b_current + b_underlying) / 2)
pixel_blend = (r_blend, g_blend, b_blend, 255)
pdb.gimp_drawable_set_pixel(current_layer, x, y, pixel_blend)
# Atualiza a camada
pdb.gimp_displays_flush()
# Registro do plugin
register(
"blend-if",
"Plugin para simular a funcionalidade Blend-If do Photoshop",
"Aplica a lógica do Blend-If nas camadas selecionadas",
"Seu Nome",
"Seu Nome",
"2023",
"<Image>/Filters/Blend-If",
"*",
[
(PF_IMAGE, "image", "Input image", None),
(PF_DRAWABLE, "drawable", "Input drawable", None),
(PF_INT, "this_layer_low", "This Layer Low", 0),
(PF_INT, "this_layer_high", "This Layer High", 255),
(PF_INT, "underlying_layer_low", "Underlying Layer Low", 0),
(PF_INT, "underlying_layer_high", "Underlying Layer High", 255),
],
[],
blend_if,
menu="<Image>/Filters"
)
main()