FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
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) |
#5
|
||||
|
||||
Edito mi post puesto que he visto tarde la imagen que adjuntas, vamos por partes;
Tienes un formulario con las siguientes propiedades;
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 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 Última edición por cHackAll fecha: 16-09-2008 a las 02:06:02. Razón: Corrijo la información |
#6
|
|||
|
|||
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) |
|
|
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 |
|