Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Form y PNG (https://www.clubdelphi.com/foros/showthread.php?t=59953)

_cero_ 14-09-2008 20:31:44

Form y PNG
 
Que tal están todos, verán estoy usando imágenes png en mi aplicación con un formulario TransparentColor=true, el problema es que de esta forma el canal alpha del png se mescla con el color del formulario en lugar del color que se encuentre detrás como debería de ser.

Así que si alguien sabe cómo solucionar este pequeño problema selo agradecería mucho.
:)

dec 14-09-2008 20:43:40

Hola,

No sé qué versión de Delphi usas (no lo dices) pero, hasta donde llego, antes de Delphi 2009, es preciso usar algún componente de terceros para trabajar con el formato de imagen PNG. No sé si ya tienes alguno instalado y no funciona como esperas. En todo caso en sitios como Torry's encontrarás seguro. Me parece que la Vampyre Imaging Library también permite trabajar con dicho formato.

_cero_ 14-09-2008 21:17:57

ayuda
 
Gracias por responder dec, y si en efecto estoy usando delphi 2007 y componentes de terceros que son TspPngImageList de DynamicSkinForm VCL.

El problema no es cargar la imagen incluso se ven perfectas si el form no es transparente, pero si lo pongo transparente digamos con un color de fondo fuchsia y la propiedad TransparentColor=true, al ejecutar la aplicación no se ve el color fuchsia pero la sombra del PNG (canal alpha) se mescla y hace un fuchsia obscuro y se ve terrible.:)

_cero_ 15-09-2008 05:32:26

ayuda
 
Pues esto sí que es todo un reto, he seguido intentando incluso e descargado el trial del delphi 2009 para probarlo (sirve de que voy viendo que mejoras trae) y no he podido solucionar este problema.

Y como una imagen dice más que mil palabras les dejo una captura para que vean más o menos lo que intento corregir.

http://www.subirimagenes.com/imagen-...1-1103881.html
(Compilado con delphi 2009)

cHackAll 16-09-2008 00:32:07

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

_cero_ 16-09-2008 16:21:03

Pues de regreso, no cabe duda que después de dormir regresan las ideas, bueno antes que nada gracias cHackAll realmente tu respuesta es total mente cierta y aclarativa.

Y en base a tu respuesta pude solucionar parcialmente mi pregunta. Debido a que el formulario se pinta y luego comienza a anular todos los pixeles fuchsia, deje la transparencia de lado y mejor cree una ilusoria copiando la pantalla y poniéndola de fondo en el formulario.

Funciona perfecto pero ahora tengo que a ser esto cada x tiempo lo que hará que segaste más memoria y procesador (aunque imperceptible pero lo hace), así que si alguien tiene otra recomendación bienbenida.

http://www.subirimagenes.com/imagen-...3-1112168.html
(Imagen de la solución)

cHackAll 16-09-2008 20:30:09

Cita:

Empezado por _cero_ (Mensaje 314368)
...cree una ilusoria copiando la pantalla y poniéndola de fondo en el formulario....

Me parece una solucion "aceptable", qué es lo que sucede si mueves el formulario?

_cero_ 16-09-2008 20:49:58

Pues copio la porción de pantalla con un timer de un milisegundo así que si muevo el formulario se ve uno que otro parpadeo pero el fondo no se pierde, por otro lado mi form no se moverá así que esto me sirve.

cHackAll 16-09-2008 20:55:05

Cita:

Empezado por _cero_ (Mensaje 314455)
Pues copio la porción de pantalla con un timer de un milisegundo así que si muevo el formulario se ve uno que otro parpadeo pero el fondo no se pierde, por otro lado mi form no se moverá así que esto me sirve.

Dejame entender... ocultas el formulario, copias lo que esta "detras" del mismo, luego lo muestras con la "porcion" copiada?

Lo que no me llego a imaginar es cómo consigues copiar lo que esta detrás de tu formulario :confused:

_cero_ 16-09-2008 22:04:24

Pues las características del form que necesito, es que nunca reciba el foco y que sea TOPMOST así que siguiendo estas características uso la función”BitBlt” que sirve para copiar porciones de pantalla, y le doy el handle de la aplicación activa para que la copiara y la pego en una imagen ya que si lo hacía en el canvas del formulario me borraba la imagen.

El problema con este método es que si una ventana no está a pantalla completa se ve una porción en blanco lo cual estoy tratando de solucionar.:(


La franja horaria es GMT +2. Ahora son las 22:15:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi