Color shifts using QUANTIZE_COLORS=256

rich.fromm nospam420 at YAHOO.COM
Fri Nov 30 15:09:54 EST 2007


Stephen Woodbridge wrote:
> 
> Thanks for the pointer to the bug. I will add some comments to it even 
> though it is closed.
> 
> Bart van den Eijnden (OSGIS) wrote:
>> there is some info by Frank in the following bug report (assuming it is 
>> not outdated):
>> 
>> http://mapserver.gis.umn.edu/bugs/show_bug.cgi?id=684
> 

I think this may be just a rehashing of this same issue, which I think is
further covered in the following (the URL has moved):

http://trac.osgeo.org/mapserver/ticket/684
Trouble tricking Mapserver colors in 8-bit mode
Ticket #684 (closed defect: wontfix)

Although since that was opened 4 years ago, last modified more than 1 year
ago, and this thread is from the time (>1 year ago) of that last
modification,
I want to make sure that this is valid and I'm understanding things
properly.

I've narrowed this down to a very simple test case (see below).  ALL that
I'm
attempting to displaying here is an 80% grey background.  This works fine
with
both the AGG and GD rendering backends, as long as quantization is not
enabled.  However, if I enable quantization, instead of getting a uniform
background of (204,204,204), I get (204,206,204).  And I'm quite surprised
at
how visually noticeable such a small green shift is.  I can preserve the
proper color if I use IMAGEMODE PC256 rather than IMAGEMODE RGB, but that is
only valid with GD.  If I try to use it with AGG, I get the following error
message:

---
msDrawMap(): Image handling error. Unable to initialize
image. msPrepareImage(): GD library error. Unable to initialize
image. msImageCreateAGG(): AGG library error. AGG driver only supports RGB
or
RGBA pixel models.
---

I have a very strong preference for using AGG instead of GD.  And I would
prefer to make my PNG's smaller by not using full 24bit color.  I realize a
plain background is a bit of an extreme case, but in this case the size
difference is dramatic:

-rw-r--r--  1 rich engr 2809 2007-11-30 11:14 agg.png
-rw-r--r--  1 rich engr  133 2007-11-30 11:15 agg_q.png
-rw-r--r--  1 rich engr 2809 2007-11-30 11:14 gd.png
-rw-r--r--  1 rich engr  133 2007-11-30 11:37 gd_q.png
-rw-r--r--  1 rich engr  133 2007-11-30 11:47 gd_256.png

And here are the color distributions within the images:

agg.png --------
0: (204,204,204)        grey80
agg_q.png --------
0: (204,206,204)        #CCCECC
gd.png --------
0: (204,204,204)        grey80
gd_q.png --------
0: (204,206,204)        #CCCECC
gd_256.png --------
0: (204,204,204)        grey80

I realize that sometimes quantization will by its very nature need to change
colors, but I had not expected this if the input image already had a
sufficiently small number of colors.

Is this indeed still recognized as a known issue that is not going to be
fixed?  One of the replies here suggested the possibility of reserving
colors
via a PALETTE option, but I can find no mention of this anywhere in the
docs.

I suppose another option would be to have mapserver output 24bit color PNG
images and use some external program (like ImageMagick) to convert to 8bit
PNG.

I am running mapserver-5.0.0, compiled with gd-2.0.35 and agg-2.5.

Complete map files to reproduce my testcases are included below.

- Rich Fromm

--- begin agg.map ---
MAP
    NAME		agg

    IMAGETYPE	AGG
    OUTPUTFORMAT
        NAME 'AGG'
        DRIVER AGG/PNG
        IMAGEMODE RGB
    END

    EXTENT  -122.293878 37.838295 -122.288122 37.841705

    SIZE		640 480
    IMAGECOLOR	204 204 204    # background
END
--- end agg.map ---

--- begin agg_q.map ---
MAP
    NAME		agg_q

    IMAGETYPE	AGG_Q
    OUTPUTFORMAT
        NAME 'AGG_Q'
        DRIVER AGG/PNG
        IMAGEMODE RGB
        FORMATOPTION "QUANTIZE_FORCE=ON"
        FORMATOPTION "QUANTIZE_DITHER=OFF"
        FORMATOPTION "QUANTIZE_COLORS=256"
    END
    
    EXTENT  -122.293878 37.838295 -122.288122 37.841705

    SIZE		640 480
    IMAGECOLOR	204 204 204    # background
END
--- end agg_q.map ---

--- begin gd.map ---
MAP
    NAME		gd

    IMAGETYPE	PNG
    OUTPUTFORMAT
        NAME 'PNG'
        DRIVER GD/PNG
        IMAGEMODE RGB
    END
    
    EXTENT  -122.293878 37.838295 -122.288122 37.841705

    SIZE		640 480
    IMAGECOLOR	204 204 204    # background
END
--- end gd.map ---

--- begin gd_q.map ---
MAP
    NAME		gd

    IMAGETYPE	PNG_Q
    OUTPUTFORMAT
        NAME 'PNG_Q'
        DRIVER GD/PNG
        IMAGEMODE RGB
        FORMATOPTION "QUANTIZE_FORCE=ON"
        FORMATOPTION "QUANTIZE_DITHER=OFF"
        FORMATOPTION "QUANTIZE_COLORS=256"
    END
    
    EXTENT  -122.293878 37.838295 -122.288122 37.841705

    SIZE		640 480
    IMAGECOLOR	204 204 204    # background

END
--- end gd_q.map ---

--- begin gd_256.map ---
MAP
    NAME		gd_256

    IMAGETYPE	PNG_256
    OUTPUTFORMAT
        NAME 'PNG_256'
        DRIVER GD/PNG
        IMAGEMODE PC256
    END
    
    EXTENT  -122.293878 37.838295 -122.288122 37.841705

    SIZE		640 480
    IMAGECOLOR	204 204 204    # background
END
--- end gd_256.map ---

-- 
View this message in context: http://www.nabble.com/Color-shifts-using-QUANTIZE_COLORS%3D256-tf2080351.html#a14092078
Sent from the Mapserver - User mailing list archive at Nabble.com.



More information about the mapserver-users mailing list