Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-09-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 14-09-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 14-09-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 15-09-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Talking 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)
Responder Con Cita
  #5  
Antiguo 16-09-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
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
  #6  
Antiguo 16-09-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
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)
Responder Con Cita
  #7  
Antiguo 16-09-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por _cero_ Ver Mensaje
...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?
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #8  
Antiguo 16-09-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Wink

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.
Responder Con Cita
  #9  
Antiguo 16-09-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por _cero_ Ver Mensaje
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
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
Responder Con Cita
  #10  
Antiguo 16-09-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como puedo asociar un form a otro form? jasz OOP 1 28-11-2007 00:12:09
Como llamar form desde otros form y regresar a la linea que se estaba ejecutando Willy Rodrigo C++ Builder 1 03-08-2007 19:36:23
Form modal deja que el form llamante tome el foco tata Varios 6 17-05-2006 11:51:37
Imposible hacer visible un form desde otro form SMTZ .NET 13 16-01-2006 21:41:08
Llamar una form desde otra form!!! niogon Varios 2 30-09-2004 16:09:17


La franja horaria es GMT +2. Ahora son las 00:26:08.


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