PGN vs. IE
Existe la creencia de que Internet Explorer no soporta el formato PNG con transparencia, cuando lo cierto es que sà lo soporta pero muy mal, es decir: lo que no representa correctamente es el canal alfa.
Como todos sabemos PNG es un formato gráfico libre y parece ser que a IE, le escuece
Un PNG puede de ser de dos tipos: con paleta (8 bits o menos) o true color (24 bits). En el primer caso el comportamiento es el de un GIF, es decir, para la transparencia se usa un color de la paleta. En el segundo se utiliza otra técnica más avanzada llamada canal alfa con la que se obtienen mejores resultados.
Si utilizamos un PNG con paleta y transparencia se mostrará como se espera en IE. Sin embargo si es true color el canal alfa lo representa con un color gris o azulado, en vez de transparente.
Una caracterÃstica propia del IE son los filtros visuales, y gracias a uno de esos filtros, AlphaImageLoader, podremos utilizar imágenes PNG sin restricciones. Veamos el siguiente código cortesÃa de Bob Osola:
Código:
function PNG_loader() {
for(var i=0; i<document.images.length; i++) {
var img = document.images[i];
var imgName = img.src.toUpperCase();
if (imgName.substring(imgName.length-3, imgName.length) == “PNG”) {
var imgID = (img.id) ? “id=’” + img.id + “‘ ” : “”;
var imgClass = (img.className) ? “class=’” + img.className + “‘ ” : “”;
var imgTitle = (img.title) ? “title=’” + img.title + “‘ ” : “title=’” + img.alt + “‘ “;
var imgStyle = “display:inline-block;” + img.style.cssText;
if (img.align == “left”) imgStyle += “float:left;”;
if (img.align == “right”) imgStyle += “float:right;”;
if (img.parentElement.href) imgStyle += “cursor:hand;”;
var strNewHTML = “<span ” + imgID + imgClass + imgTitle
+ ” style=\”" + “width:” + img.width + “px; height:” + img.height + “px;” + imgStyle + “;”
+ “filter:progid:DXImageTransform.Microsoft.AlphaImageLoader”
+ “(src=\’” + img.src + “\’, sizingMethod=’scale’);\”></span>”;
img.outerHTML = strNewHTML;
i–;
}
}
}
window.attachEvent(”onload”, PNG_loader);
Con este código, una vez cargada la página, se recorren todas las imágenes del documento, y si son PNG se sustituye la etiqueta img por otra span, donde se carga la imágen a través del filtro. Además la etiqueta span “heredará” los atributos id, class y title de la etiqueta img.
Si guardamos este código en un fichero llamado por ejemplo png.js podremos incluirlo en nuestras páginas de la siguiente forma (en la sección head):
| Código: |
| <!–[if gte IE 5.5000]> <script type=”text/javascript” src=”png.js”></script> <![endif]–> |
De esta forma sólo se cargará y ejecutará en IE 5.5 o superior. Por último, apuntar algunas cosas:
- Como he dicho antes, este proceso se ejecuta una vez cargada la página, mientras se estén cargando las imágenes se mostrarán incorrectamente.
- No es recomendable abusar de este tipo de imágenes, o la carga se ralentizará en exceso.
- Existe una técnica similar desarrollada por Lloyd Dalton desarrollada en CSS, para los curiosos (yo recomiendo la aquà explicada, dejará las hojas de estilo libres de hacks).
Por supuesto lo ideal serÃa que IE tratase correctamente los PNGs y no tener que recurrir a este tipo de técnicas, pero mientras tanto ya tenemos una forma sencilla de incluir este tipo de imágenes en nuestra web. Y es que casi todo tiene arreglo…
Fuente principal: tomatoma.ws
Comentarios
5 February, 2007
Pero a ver… ¿Quién es el depravado que sigue usando IE?
http://es.wikipedia.org/wiki/PNG
5 February, 2007
Eso eso !!! que levante la mano!!!

8 February, 2007
Eso es mentira! (o al menos no está bien matizado)
IE soporta PNG v.1.0 y actualmente el standard es el 1.2 de aqui que no soporte el canal alfa, ya que la spec 1.0 no incluye canal alfa, en cuanto a “existe la creencia” ¿acaso no es una realidad? IE NO SOPORTA canal alfa.
Al menos, el PNG es retrocompatible y no da problemas, una de las virtudes del png, es que está diseñado por bloques (chunks) y permite que cualquier decodificador (por cutre que sea) pueda leer un mÃnimo de información, la culpa en parte de ese “fallo” de IE se debe al formato, ya que especificaron la capa alpha como “no critica” ( http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.tRNS ) y eso permite que un decodificador PNG no de error al ignorar el bloque alfa.
Un saludo!
P.D. mi sudor me costó currarme un decodificador PNG en python 8-P
8 February, 2007
Si lo hubieras hecho en Perl habrÃas sudado menos y no tendrÃas que haber gastado tanto desodorante. Eso habrÃa significado que tu sudor te habrÃa costado menos (o eso o compras un traje destilador a los Fremens de la esquina)
9 February, 2007
Python ya tiene varias librerÃas para decodificar png’s, lo hice por placer, igual que intenté hacer uno en ensamblador.
PD. los enanitos verdes son gays 8-P
26 August, 2008
[...] Â http://www.solusan.com/pgn-vs-ie.html [...]