[ka-Map-users] On IMAGECOLOR and ANTIALIAS

Paul Spencer pspencer at dmsolutions.ca
Wed Jun 7 08:09:50 EDT 2006


when you use transparency alpha, mapserver generates 24 bit pngs with  
an alpha channel.  This is okay in most browsers, but unfortunately  
Internet Explorer cannot handle this type of image.  I am assuming  
that you are experiencing this problem with Internet Explorer and the  
rest of my comments are directed to solving this particular problem.   
If this isn't the case, please let me know.  I'm including a lengthy  
explanation of the problem and resolution 'for the record'.

Short Answer:

you probably need to include the following metadata in each of your  

"imageformat" "alpha"

Long Answer (with technical explanation of the problem):

The 'standard' way of dealing with this problem in Internet Explorer  
is to use something called the PNG HACK.  png hack works by replacing  
the src of an image with a transparent gif and then using an activex  
control to load the png.  This works very well, but it is quite  
tricky to get exactly right.  All versions of this hack boil down to  
this solution.  Some use behaviours, some use css and javascript, and  
some use javascript.  All end up doing essentially the same thing.   
The common element amongst all of them is that the image must have an  
explicit size (which isn't a problem in the case of tiles at least).

I've distilled this hack down to its smallest, least intrusive  
working parts in ka-Map.  In screen.css, there is a CSS class:

/* img elements with a class of png24 will have the png24 filter hack  
* in IE browsers only.  To make this work, images MUST have a width  
and height
* specified.  The minimum tag required is:
*     <img class="png24" src="<url>" width="xx" height="xx">
img.png24 { filter:expression(applyPNGFilter(this)) }

This class means that an <img> tag with a class="png24" (or  
img.className = 'png24' in javascript) will get a filter.  Filter is  
a CSS style that only Internet Explorer understands.  In addition,  
Internet Explorer allows you to execute javascript inside a CSS  
style.  The result is that we can programmatically construct an  
appropriate filter for the image.  This is done inside the  
applyPNGFilter function found in startUp.js.

Conveniently, we can pass 'this' as an argument at it resolves to the  
actual image object.  The resulting function does the magic:

*  applyPNGFilter(o)
*  Applies the PNG Filter Hack for IE browsers when showing 24bit PNG's
*  var o = object (this png element in the page)
* The filter is applied using a nifty feature of IE that allows  
javascript to
* be executed as part of a CSS style rule - this ensures that the  
hack only
* gets applied on IE browsers :)
function applyPNGFilter(o) {
     var t="images/a_pixel.gif";
     if( o.src != t ) {
         var s=o.src;
         o.src = t;
         o.runtimeStyle.filter =  

This should now work for any image in the browser.  Unfortunately, we  
couldn't get it to work for tiles since, for efficiency, we are  
constantly reusing img objects when zooming and panning.  IE just  
never seems to set the tile source correctly.  So in the case of  
tiles, we resorted to adding a property to tile images called  
ie_hack.  If this is true, then when a tile is loaded (as reported by  
the onload event of the image), its source is changed to be a  
transparent gif and the above code is executed (or something very  
like it).

The trick to getting all this to work is to ensure that ie_hack is  
set to true.  ie_hack is set IF the browser is internet explorer AND  
the layer has an imageformat AND the imageformat is alpha.

imageformat is set in init.php based on the mapfile imageformat type  
or a layer-specific meta data.  Unfortunately, if you don't set the  
layer metadata "imageformat" "alpha" then this will never work in IE  
because the mapfile imageformat will likely be PNG24.

Random Musings:

It seems to me now that I have worked through this in my head that we  
could make this work in the general case without requiring metadata  
just by using "imageformat" "alpha" if the mapfile image format is  
PNG24.  This could be combined with detecting if TRANSPARENCY ALPHA  
is set on the layer since it would be unnecessary to use the ie_hack  

If someone with IE is willing to try this, I'll commit the changes  
once you have it working



On 7-Jun-06, at 6:00 AM, Pg wrote:

> Another problem with colors and transparecis with PNG24.
> Ka-Map generates bad images, while the same map-file accessed as  
> WMS generates the correct image.
> My map file contains:
> IMAGECOLOR 254 254 253  (was "255 255 255": same problem)
> [...]
>   NAME nav_activepath
>   [...]
>     NAME "Anomalia"
>     EXPRESSION "t"
>     STYLE
>       COLOR 100 0 100
>       WIDTH 5
>       ANTIALIAS true
>     END
>   END
>     NAME "Normale"
>     STYLE
>       COLOR 0 30 160
>       WIDTH 5
>       ANTIALIAS true
>     END
>   END
> The image generated by mapserver (as WMS server) is correct (see  
> file WMS_Image.png).
> The image generated by tile.php the lines of the layer group  
> "PERCORSI" looks very strange (see file kamap_image.png). Also the  
> legend generated by ka-map present a similar problem (see  
> kamap_legend.png).
> If I remove the directive "ANTIALIAS true" from the style of the  
> layer, everithing is ok.
> Any idea?
> <WMS_Image.png>
> <kamap_image.png>
> <kamap_legend.png>
> _______________________________________________
> ka-Map-users mailing list
> ka-Map-users at lists.maptools.org
> http://lists.maptools.org/mailman/listinfo/ka-map-users

|Paul Spencer                           pspencer at dmsolutions.ca   |
|Applications & Software Development                              |
|DM Solutions Group Inc                 http://www.dmsolutions.ca/|

More information about the ka-Map-users mailing list