[fpc-devel] Patch for fpimage.inc bug
Giulio BERNA
ugilio at hotmail.com
Wed Aug 10 02:09:07 CEST 2005
Hi, I found a bug in fpimage.inc and there is a patch.
The problem was in TFPCustomImage.Assign: palette was generated with a
Build(Src)
(Src is the image that must be copied in this image).
Build works this way: builds a palette scanning every pixel of the source
image.
Then the data is copied via the pixel[x,y] property.
The problem is that pixel data is relative to palette, but build(src)
generates a palette with the same colors of the original but with a
different order (in fact since it generates the palette scanning the pixel
of the source image, palette order isn't the same as the original!).
The correct way to build the palette is to use
Merge(Src.Palette)
since palette is copied exactly as it is.
Now, about the mail I sent yesterday: I started writing the quantizer stuff,
and I think it's working very well.
I implemented a TFPQuantizer class, which has abstract methods and is the
base class for all quantizers.
Then i wrote a descendant, TFPOctreeQuantizer, which is a quantizer that
implements the Octree algorithm.
Quantizers just return a palette, since their work is to generate a palette
of arbitrary size from a given image.
So i wrote also a TFPBaseDitherer class.
This is the base class for all ditherers, but strictly speaking it isn't
really a ditherer: you give it an image and a palette, and the ditherer
transform the image so that it uses the palette you provide (basically it
finds for every pixel in the image the best color in the palette).
This class has useful protected methods to find the best matching color,
distances between colors and so on.
Descendant classes can use this methods to implement specific dithering
algorithms (maybe I'll write a ditherer that implements the Floyd-Steinberg
algorithm).
So If you want to reduce the color depth of an image you can use the
quantizer to generate a palette from your image, and then pass the image and
the generated palette to the ditherer.
In a very near future we could save images with the bpp we want, and do
palette reductions and so on :)
Is there someone working on tfpcustomimage and related things? I think it
would be better if I talk directly to him instead of bloating the mailing
list...
bye,
Giulio.
this is the patch:
Index: fpimage.inc
===================================================================
--- fpimage.inc (revision 837)
+++ fpimage.inc (working copy)
@@ -398,7 +398,7 @@
If UsePalette then
begin
Palette.Count:=0;
- Palette.Build(Src);
+ Palette.Merge(Src.Palette);
end;
// Copy image.
SetSize(Src.Width,Src.height);
More information about the fpc-devel
mailing list