[Gimp-developer] Handling of transparent pixels

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Here is a long overdue and long-winded update to the discussion about
editing the alpha channel and how transparent pixels should be
handled...

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
   convenience.

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
     supports transparency.
   - 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).

-Raphaël


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.

[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux