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) |
#7
|
||||
|
||||
Me parece una solucion "aceptable", qué es lo que sucede si mueves el formulario?
|
#8
|
|||
|
|||
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.
|
#9
|
||||
|
||||
Cita:
Lo que no me llego a imaginar es cómo consigues copiar lo que esta detrás de tu formulario |
#10
|
|||
|
|||
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. |
|
|
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 |
|