Tema: Form y PNG
Ver Mensaje Individual
  #5  
Antiguo 16-09-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 22
cHackAll Va por buen camino
Edito mi post puesto que he visto tarde la imagen que adjuntas, vamos por partes;

Tienes un formulario con las siguientes propiedades;

Código Delphi [-]
  Color = clFuchsia
  TransparentColor = True
  TransparentColorValue = clFuchsia

Con ello tienes un formulario con regiones nulas (transparentes), internamente la API SetLayeredWindowAttributes le dice el SO que debe reconoce al color clFuchsia ($FF00FF) como máscara para dicho efecto, cada region (~pixel) que sea IGUAL a dicho valor exacto será automáticamente "anulado".

Ahora tienes una imagen PNG que contiene un "Alpha channel" (especificación 2.4), que indica un valor de transparencia por "pixel", dicho valor puede ser de 0 a N donde 0 significa que el pixel será completamente transparente ("hueco") y mediante vaya siendo un valor mayor hacia N será un color mas "fuerte". Esto funciona de la misma forma que la propiedad AlphaBlendValue en un formulario normal.

La imagen que estas utilizando, no solo tiene valores Alpha = 0 (que indica total transparencia), sino que también tiene alrededor de la imagen valores de transparencia parciales (ejemplo).

Para ser más directos; cada pixel (en cualquier proceso de opacidad) es promediado con el color de fondo, ósea que para cada R, G y B:

Código:
 x = ((x1 / MAX(x)) * ((Alpha / MAX(Alpha)) * MAX(x)) + x2) / 2


Donde:
 x = Resultado
 x1 = R, G o B del pixel de la imagen
 x2 = R, G o B del pixel de fondo
 Alpha = valor "Alpha channel"
 MAX(x) = valor maximo de x
 MAX(Alpha) = valor máximo de Alpha
El resultado de la anterior fórmula en las secciones del gráfico que tu llamas "mal uso del canal Alpha" son pixeles con valores distintos de clFuchsia -sino como ya explique- valores promediados con un grado de opacidad, y como también ya había explicado un color distinto de $FF00FF (talvez un $FF00FE) no es considerado por el SO para el proceso de Transparencia.

Lo que tu quieres es algo que todavía no he visto en ningúna aplicación y es un formulario normal SOLO en la parte de la imagen que no usa Alpha channel, opaco SOLO en las partes de la imagen que usan Alpha channel y transparente en el resto. Lo puedes realizar incrustando un formulario dentro de otro y dividiendo por secciones la imagen, eliminando cualquier Alpha channel que sea parcial, o usando un color de transparencia para la imagen gris.

No quise haberte aburrido con la explicacion, pero notarás que era necesaria.

Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx

Última edición por cHackAll fecha: 16-09-2008 a las 02:06:02. Razón: Corrijo la información
Responder Con Cita