Here is a long overdue and long-winded update to the discussion about
editing the alpha channel and how transparent pixels should be
One thing that has not been mentioned in this discussion so far is
that there are two kinds of transparent pixels: those that have been
made transparent during the current GIMP editing session, and those
that were already transparent when the file was loaded from disk or
obtained from a plug-in.
1) For the pixels that have been made transparent during the current
editing session, one point of view could be to consider the alpha
channel as a "hiding mechanism" that does not modify the RGB data.
However, if the goal is to be able to un-erase some pixels that
were accidentally made transparent, then an "undo brush" would be a
more appropriate solution to that problem. So the concept of
"hiding without destroying" is not really necessary if the same
data can be retrieved from the undo history with the same
2) For the pixels that have been obtained from an external source,
then the "hiding" concept does not fit because the RGB data is
undefined. For the files loaded from disk, the RGB values of
transparent pixels depend on the file format, on the programs that
have previously processed the file, on the current implementation
of the plug-in, etc. There are several cases:
- Some indexed formats (e.g., GIF) associate a default color with
the transparent areas to be used by programs that are not able to
handle transparency correctly. Note that nothing requires a GIMP
plug-in to store this color in the image, because the GIMP
- Some other formats (e.g., RGBA PNG) store full RGBA data, so the
transparent pixels may contain some RGB values. However, these
values may be discarded by other image processing software or by
tools such as pngcrunch. A GIMP plug-in could also discard the
color of transparent pixels while loading or saving an image in
order to improve the compression.
- In some other formats (e.g., WAD textures), the transparent
pixels are simply not stored: they are defined as a number of
pixels to skip in the current row or column, so there is not even
a concept of "default color" for these pixels. In this case, the
RGB values depend only on internal implementation details of the
plug-in used to load the file.
So the concept "alpha = hiding" does not work for case (2). In
addition, even case (1) has some problems because sticking to that
model would prevent the GIMP or GEGL from optimizing the memory usage
by clearing and freeing tiles that are fully transparent (this would
be useful if we want to implement layers that grow and shrink on
demand, as requested in bug #93639 and bug #98776).
It is better to consider the transparent pixels to have undefined RGB
values and to make sure that these RGB values are never exposed to the
user (that would be a bug). Other well-known programs have solved the
problem of un-erasing pixels by introducing an undo brush. I would
like the GIMP to reach or exceed the quality of these professional
programs by making sure that the features are implemented in the right
way instead of introducing new bugs.
This is is why I was suggesting to remove the bug introduced by
#127930 before it makes it into a stable release, and instead
implement what I suggested in bug #128118. Beyond the next release,
this is also why we should consider removing the "anti-erase" mode of
the eraser tool in a future release and replace it by an undo brush.
This would improve the quality of the GIMP and make sure that the
users do not consider the alpha channel to be something that it cannot
be (not always, at least).
P.S.: I would also like to add that this discussion applies also to
the pixels that are partially transparent, not only those with
alpha=0. For a pixel with alpha=1, the only thing that matters
for the R, G and B values is whether they are greater or lower
than 128 because the result after composition would be the same.
A program could decide to replace any value between 0 and 127 by
another value in the same range if that would improve the
compression of the image. Same for alpha=2, alpha=3, and so
on... So we could consider the RGB values to be defined only to
the extent that they make a difference after composition, which
means that the undefined color range for a pixel is the full
range when alpha=0 and gets smaller as alpha increases.
P.P.S.: In a comment added to bug #127930, Guillermo S. Romero
mentions that some games such as Tribes2 use RGBA PNGs and store
some information in the A channel that is not alpha (reflection
effect), so it would be useful to be able to edit alpha
directly. However, I disagree because this kind of abuse of the
file format should be supported by a specific plug-in instead of
adding unreasonable requirements to the GIMP core. The plug-in
could expose the reflection channel (A) as a separate layer. In
the same vein, POV-Ray abuses the TGA format for storing 16-bits
POV height fields by combining the 8 bits from the green channel
and the 8 bits from the red channel to create a 16-bits
grayscale channel. I think that the conversion to and from this
special TGA format should be handled by a specific plug-in and
not by the paint core, just like it should be done for the
special PNG images used by Tribes2.
Gimp-developer mailing list