[devel] Fix typos and indentation in new material in the documentation.
This commit is contained in:
parent
cb0b29631f
commit
593fc04096
@ -697,92 +697,92 @@ you may need to call png_set_alpha_mode:
|
|||||||
png_set_alpha_mode(png_ptr, mode, screen_gamma);
|
png_set_alpha_mode(png_ptr, mode, screen_gamma);
|
||||||
|
|
||||||
The screen_gamma value is the same as the argument to png_set_gamma, however how
|
The screen_gamma value is the same as the argument to png_set_gamma, however how
|
||||||
it effects the output depends on the mode. png_set_alpha_mode sets the file
|
it affects the output depends on the mode. png_set_alpha_mode() sets the file
|
||||||
gamma default to 1/screen_gamma, so normally you don't need to call
|
gamma default to 1/screen_gamma, so normally you don't need to call
|
||||||
png_set_gamma. If you need different defaults call png_set_gamma before
|
png_set_gamma. If you need different defaults call png_set_gamma() before
|
||||||
png_set_alpha_mode - if you call it after it will override the settings made by
|
png_set_alpha_mode() - if you call it after it will override the settings made
|
||||||
png_set_alpha_mode.
|
by png_set_alpha_mode().
|
||||||
|
|
||||||
The mode is as follows:
|
The mode is as follows:
|
||||||
|
|
||||||
PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
|
PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
|
||||||
green and blue, or gray, components are gamma encoded color
|
green and blue, or gray, components are gamma encoded color
|
||||||
values and are not premultiplied by the alpha value. The
|
values and are not premultiplied by the alpha value. The
|
||||||
alpha value is a linear measure of the contribution of the
|
alpha value is a linear measure of the contribution of the
|
||||||
pixel to the corresponding final output pixel.
|
pixel to the corresponding final output pixel.
|
||||||
|
|
||||||
You should normally use this format if you intend to perform
|
You should normally use this format if you intend to perform
|
||||||
color correction on the color values; most, maybe all, color
|
color correction on the color values; most, maybe all, color
|
||||||
correction software has no handling for the alpha channel and,
|
correction software has no handling for the alpha channel and,
|
||||||
anyway, the math to handle pre-multiplied component values is
|
anyway, the math to handle pre-multiplied component values is
|
||||||
unnecessarily complex.
|
unnecessarily complex.
|
||||||
|
|
||||||
Before you do any arithmetic on the component values you need
|
Before you do any arithmetic on the component values you need
|
||||||
to remove the gamma encoding and multiply out the alpha
|
to remove the gamma encoding and multiply out the alpha
|
||||||
channel. See the PNG specification for more detail. It is
|
channel. See the PNG specification for more detail. It is
|
||||||
important to note that when an image with an alpha channel is
|
important to note that when an image with an alpha channel is
|
||||||
scaled linear encoded, pre-multiplied, component values must
|
scaled, linear encoded, pre-multiplied component values must
|
||||||
be used!
|
be used!
|
||||||
|
|
||||||
The remaining modes assume you don't need to do any further color correction or
|
The remaining modes assume you don't need to do any further color correction or
|
||||||
that if you do your color correction software knows all about alpha (it
|
that if you do your color correction software knows all about alpha (it
|
||||||
probably doesn't!)
|
probably doesn't!)
|
||||||
|
|
||||||
PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
|
PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
|
||||||
assumed by most correctly written graphics software.
|
assumed by most correctly written graphics software.
|
||||||
The gamma encodiing will be removed by libpng and the
|
The gamma encoding will be removed by libpng and the
|
||||||
linear component values will be pre-multiplied by the
|
linear component values will be pre-multiplied by the
|
||||||
alpha channel.
|
alpha channel.
|
||||||
|
|
||||||
With this format the final image must be re-encoded to
|
With this format the final image must be re-encoded to
|
||||||
match the display gamma before the image is displayed.
|
match the display gamma before the image is displayed.
|
||||||
If your system doesn't do that, yet still seems to
|
If your system doesn't do that, yet still seems to
|
||||||
perform arithmetic on the pixels without decoding them,
|
perform arithmetic on the pixels without decoding them,
|
||||||
it is broken - check out the modes below.
|
it is broken - check out the modes below.
|
||||||
|
|
||||||
With PNG_ALPHA_STANDARD libpng always produces linear
|
With PNG_ALPHA_STANDARD libpng always produces linear
|
||||||
component values, whatever screen_gamma you supply. The
|
component values, whatever screen_gamma you supply. The
|
||||||
screen_gamma value is, however, used as a default for
|
screen_gamma value is, however, used as a default for
|
||||||
the file gamma if the PNG file has no gamma information.
|
the file gamma if the PNG file has no gamma information.
|
||||||
|
|
||||||
If you call png_set_gamma after png_set_alpha_mode you
|
If you call png_set_gamma() after png_set_alpha_mode() you
|
||||||
will override the linear encoding. Instead the
|
will override the linear encoding. Instead the
|
||||||
pre-multiplied pixel values will be gamma encoded but
|
pre-multiplied pixel values will be gamma encoded but
|
||||||
the alpha channel will still be linear. This may
|
the alpha channel will still be linear. This may
|
||||||
actually match the requirements of some broken software,
|
actually match the requirements of some broken software,
|
||||||
but it is unlikely.
|
but it is unlikely.
|
||||||
|
|
||||||
While linear 8 bit data is often used it has
|
While linear 8-bit data is often used it has
|
||||||
insufficient precision for any image with a reasonable
|
insufficient precision for any image with a reasonable
|
||||||
dynamic range. To avoid problems, and if your software
|
dynamic range. To avoid problems, and if your software
|
||||||
supports it, use png_set_expand_16() to force all
|
supports it, use png_set_expand_16() to force all
|
||||||
components to 16 bits.
|
components to 16 bits.
|
||||||
|
|
||||||
PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
|
PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
|
||||||
completely opaque pixels are gamma encoded according to
|
completely opaque pixels are gamma encoded according to
|
||||||
the screen_gamma value. Pixels with alpha less than 1.0
|
the screen_gamma value. Pixels with alpha less than 1.0
|
||||||
will still have linear components.
|
will still have linear components.
|
||||||
|
|
||||||
Use this format if you have control over your
|
Use this format if you have control over your
|
||||||
compositing software and do don't do other arithmetic
|
compositing software and do don't do other arithmetic
|
||||||
(such as scaling) on the data you get from libpng. Your
|
(such as scaling) on the data you get from libpng. Your
|
||||||
compositing software can simply copy opaque pixels to
|
compositing software can simply copy opaque pixels to
|
||||||
the output but still has linear values for the
|
the output but still has linear values for the
|
||||||
non-opaque pixels.
|
non-opaque pixels.
|
||||||
|
|
||||||
In normal compositing, where the alpha channel encodes
|
In normal compositing, where the alpha channel encodes
|
||||||
partial pixel coverage (as opposed to broad area
|
partial pixel coverage (as opposed to broad area
|
||||||
translucency), the inaccuracies of the 8 bit
|
translucency), the inaccuracies of the 8-bit
|
||||||
representation of non-opaque pixels are irrelevant.
|
representation of non-opaque pixels are irrelevant.
|
||||||
|
|
||||||
You can also try this format if your software is broken;
|
You can also try this format if your software is broken;
|
||||||
it might look better.
|
it might look better.
|
||||||
|
|
||||||
PNG_ALPHA_BROKEN This is PNG_ALPHA_STANDARD however all component values,
|
PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD however all component values,
|
||||||
including the alpha channel are gamma encoded. This is
|
including the alpha channel are gamma encoded. This is
|
||||||
an appropriate format to try if your software, or more
|
an appropriate format to try if your software, or more
|
||||||
likely hardware, is totally broken: if it performs
|
likely hardware, is totally broken: if it performs
|
||||||
linear arithmetic directly on gamma encoded values.
|
linear arithmetic directly on gamma encoded values.
|
||||||
|
|
||||||
In most cases of broken software or hardware the bug in the final display
|
In most cases of broken software or hardware the bug in the final display
|
||||||
manifests as a subtle halo around composited parts of the image. You may not
|
manifests as a subtle halo around composited parts of the image. You may not
|
||||||
@ -791,35 +791,41 @@ separate from the background, as though it had been cut out of paper and pasted
|
|||||||
on afterward.
|
on afterward.
|
||||||
|
|
||||||
If you don't have to deal with bugs in software or hardware, or if you can fix
|
If you don't have to deal with bugs in software or hardware, or if you can fix
|
||||||
them, there are three recommended ways of using png_set_alpha_mode:
|
them, there are three recommended ways of using png_set_alpha_mode():
|
||||||
|
|
||||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG, screen_gamma);
|
png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG,
|
||||||
You can do color correction on the result (libpng does not currently
|
screen_gamma);
|
||||||
support color correction internally.) When you handle the alpha channel
|
|
||||||
you need to undo the gamma encoding and multipy out the alpha.
|
|
||||||
|
|
||||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD, screen_gamma);
|
You can do color correction on the result (libpng does not currently
|
||||||
|
support color correction internally.) When you handle the alpha channel
|
||||||
|
you need to undo the gamma encoding and multiply out the alpha.
|
||||||
|
|
||||||
|
png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
|
||||||
|
screen_gamma);
|
||||||
png_set_expand_16(png_ptr);
|
png_set_expand_16(png_ptr);
|
||||||
If you are using the high level interface don't call png_set_expand_16,
|
|
||||||
instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
|
|
||||||
|
|
||||||
With this mode you can't do color corrrection, but you can do arithmetic,
|
If you are using the high level interface don't call png_set_expand_16();
|
||||||
including composition and scaling, on the data without further processing.
|
instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
|
||||||
|
|
||||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMZED, screen_gamma);
|
With this mode you can't do color correction, but you can do arithmetic,
|
||||||
You can avoid the expansion to 16 bit components with this mode, but you
|
including composition and scaling, on the data without further processing.
|
||||||
lose the ability to scale the image or perform other linear arithmetic.
|
|
||||||
All you can do is compose the result onto a matching output. Since this
|
png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMIZED,
|
||||||
mode is libpng specific you also need to write your own composition
|
screen_gamma);
|
||||||
software.
|
|
||||||
|
You can avoid the expansion to 16-bit components with this mode, but you
|
||||||
|
lose the ability to scale the image or perform other linear arithmetic.
|
||||||
|
All you can do is compose the result onto a matching output. Since this
|
||||||
|
mode is libpng specific you also need to write your own composition
|
||||||
|
software.
|
||||||
|
|
||||||
If you don't need, or can't handle, the alpha channel you can call
|
If you don't need, or can't handle, the alpha channel you can call
|
||||||
png_set_background to remove it by compositing against a fixed color. Don't
|
png_set_background() to remove it by compositing against a fixed color. Don't
|
||||||
call png_set_strip_alpha to do this - it will leave spurious pixel values in
|
call png_set_strip_alpha() to do this - it will leave spurious pixel values in
|
||||||
transparent parts of this image.
|
transparent parts of this image.
|
||||||
|
|
||||||
png_set_background(png_ptr, &background_color, PNG_BACKGROUND_GAMMA_SCREEN,
|
png_set_background(png_ptr, &background_color,
|
||||||
0, 1);
|
PNG_BACKGROUND_GAMMA_SCREEN, 0, 1);
|
||||||
|
|
||||||
The background_color is an RGB or grayscale value according to the data format
|
The background_color is an RGB or grayscale value according to the data format
|
||||||
libpng will produce for you. Because you don't yet know the format of the PNG
|
libpng will produce for you. Because you don't yet know the format of the PNG
|
||||||
@ -864,7 +870,7 @@ you want to do are limited to the following set:
|
|||||||
|
|
||||||
PNG_TRANSFORM_IDENTITY No transformation
|
PNG_TRANSFORM_IDENTITY No transformation
|
||||||
PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
|
PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
|
||||||
8 bits
|
8-bit
|
||||||
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
|
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
|
||||||
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
|
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
|
||||||
samples to bytes
|
samples to bytes
|
||||||
@ -1428,7 +1434,7 @@ severe accuracy loss.
|
|||||||
png_set_expand_16(png_ptr);
|
png_set_expand_16(png_ptr);
|
||||||
|
|
||||||
PNG can have files with 16 bits per channel. If you only can handle
|
PNG can have files with 16 bits per channel. If you only can handle
|
||||||
8 bits per channel, this will strip the pixels down to 8 bit.
|
8 bits per channel, this will strip the pixels down to 8-bit.
|
||||||
|
|
||||||
if (bit_depth == 16)
|
if (bit_depth == 16)
|
||||||
png_set_strip_16(png_ptr);
|
png_set_strip_16(png_ptr);
|
||||||
@ -1649,10 +1655,11 @@ to convey this information, however only two combinations are like to be useful:
|
|||||||
|
|
||||||
The second call was described above - my_background is in the format of the
|
The second call was described above - my_background is in the format of the
|
||||||
final, display, output produced by libpng. Because you now know the format of
|
final, display, output produced by libpng. Because you now know the format of
|
||||||
the PNG it is possible to avoid the need to choose either 8 or 16 bit output and
|
the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
|
||||||
to retain palette images (the palette colors will be modified appropriately and
|
output and to retain palette images (the palette colors will be modified
|
||||||
the tRNS chunk removed.) However, if you are doing this, take great care not to
|
appropriately and the tRNS chunk removed.) However, if you are doing this,
|
||||||
ask for transformations without checking first that they apply!
|
take great care not to ask for transformations without checking first that
|
||||||
|
they apply!
|
||||||
|
|
||||||
In the first call the background color has the original bit depth and color type
|
In the first call the background color has the original bit depth and color type
|
||||||
of the PNG file. So, for palette images the color is supplied as a palette
|
of the PNG file. So, for palette images the color is supplied as a palette
|
||||||
@ -1727,7 +1734,7 @@ This function can also be used to invert grayscale and gray-alpha images:
|
|||||||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
png_set_invert_mono(png_ptr);
|
png_set_invert_mono(png_ptr);
|
||||||
|
|
||||||
PNG files store 16 bit pixels in network byte order (big-endian,
|
PNG files store 16-bit pixels in network byte order (big-endian,
|
||||||
ie. most significant bits first). This code changes the storage to the
|
ie. most significant bits first). This code changes the storage to the
|
||||||
other way (little-endian, i.e. least significant bits first, the
|
other way (little-endian, i.e. least significant bits first, the
|
||||||
way PCs store them):
|
way PCs store them):
|
||||||
@ -3040,7 +3047,7 @@ is required by PNG.
|
|||||||
|
|
||||||
png_set_shift(png_ptr, &sig_bit);
|
png_set_shift(png_ptr, &sig_bit);
|
||||||
|
|
||||||
PNG files store 16 bit pixels in network byte order (big-endian,
|
PNG files store 16-bit pixels in network byte order (big-endian,
|
||||||
ie. most significant bits first). This code would be used if they are
|
ie. most significant bits first). This code would be used if they are
|
||||||
supplied the other way (little-endian, i.e. least significant bits
|
supplied the other way (little-endian, i.e. least significant bits
|
||||||
first, the way PCs store them):
|
first, the way PCs store them):
|
||||||
@ -3456,7 +3463,7 @@ the simpler ones to get an idea of how they work. Try to find a similar
|
|||||||
transformation to the one you want to add and copy off of it. More details
|
transformation to the one you want to add and copy off of it. More details
|
||||||
can be found in the comments inside the code itself.
|
can be found in the comments inside the code itself.
|
||||||
|
|
||||||
Configuring for 16 bit platforms
|
Configuring for 16-bit platforms
|
||||||
|
|
||||||
You will want to look into zconf.h to tell zlib (and thus libpng) that
|
You will want to look into zconf.h to tell zlib (and thus libpng) that
|
||||||
it cannot allocate more then 64K at a time. Even if you can, the memory
|
it cannot allocate more then 64K at a time. Even if you can, the memory
|
||||||
|
197
libpng.3
197
libpng.3
@ -1648,92 +1648,92 @@ you may need to call png_set_alpha_mode:
|
|||||||
png_set_alpha_mode(png_ptr, mode, screen_gamma);
|
png_set_alpha_mode(png_ptr, mode, screen_gamma);
|
||||||
|
|
||||||
The screen_gamma value is the same as the argument to png_set_gamma, however how
|
The screen_gamma value is the same as the argument to png_set_gamma, however how
|
||||||
it effects the output depends on the mode. png_set_alpha_mode sets the file
|
it affects the output depends on the mode. png_set_alpha_mode() sets the file
|
||||||
gamma default to 1/screen_gamma, so normally you don't need to call
|
gamma default to 1/screen_gamma, so normally you don't need to call
|
||||||
png_set_gamma. If you need different defaults call png_set_gamma before
|
png_set_gamma. If you need different defaults call png_set_gamma() before
|
||||||
png_set_alpha_mode - if you call it after it will override the settings made by
|
png_set_alpha_mode() - if you call it after it will override the settings made
|
||||||
png_set_alpha_mode.
|
by png_set_alpha_mode().
|
||||||
|
|
||||||
The mode is as follows:
|
The mode is as follows:
|
||||||
|
|
||||||
PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
|
PNG_ALPHA_PNG: The data is encoded according to the PNG specification. Red,
|
||||||
green and blue, or gray, components are gamma encoded color
|
green and blue, or gray, components are gamma encoded color
|
||||||
values and are not premultiplied by the alpha value. The
|
values and are not premultiplied by the alpha value. The
|
||||||
alpha value is a linear measure of the contribution of the
|
alpha value is a linear measure of the contribution of the
|
||||||
pixel to the corresponding final output pixel.
|
pixel to the corresponding final output pixel.
|
||||||
|
|
||||||
You should normally use this format if you intend to perform
|
You should normally use this format if you intend to perform
|
||||||
color correction on the color values; most, maybe all, color
|
color correction on the color values; most, maybe all, color
|
||||||
correction software has no handling for the alpha channel and,
|
correction software has no handling for the alpha channel and,
|
||||||
anyway, the math to handle pre-multiplied component values is
|
anyway, the math to handle pre-multiplied component values is
|
||||||
unnecessarily complex.
|
unnecessarily complex.
|
||||||
|
|
||||||
Before you do any arithmetic on the component values you need
|
Before you do any arithmetic on the component values you need
|
||||||
to remove the gamma encoding and multiply out the alpha
|
to remove the gamma encoding and multiply out the alpha
|
||||||
channel. See the PNG specification for more detail. It is
|
channel. See the PNG specification for more detail. It is
|
||||||
important to note that when an image with an alpha channel is
|
important to note that when an image with an alpha channel is
|
||||||
scaled linear encoded, pre-multiplied, component values must
|
scaled, linear encoded, pre-multiplied component values must
|
||||||
be used!
|
be used!
|
||||||
|
|
||||||
The remaining modes assume you don't need to do any further color correction or
|
The remaining modes assume you don't need to do any further color correction or
|
||||||
that if you do your color correction software knows all about alpha (it
|
that if you do your color correction software knows all about alpha (it
|
||||||
probably doesn't!)
|
probably doesn't!)
|
||||||
|
|
||||||
PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
|
PNG_ALPHA_STANDARD: The data libpng produces is encoded in the standard way
|
||||||
assumed by most correctly written graphics software.
|
assumed by most correctly written graphics software.
|
||||||
The gamma encodiing will be removed by libpng and the
|
The gamma encoding will be removed by libpng and the
|
||||||
linear component values will be pre-multiplied by the
|
linear component values will be pre-multiplied by the
|
||||||
alpha channel.
|
alpha channel.
|
||||||
|
|
||||||
With this format the final image must be re-encoded to
|
With this format the final image must be re-encoded to
|
||||||
match the display gamma before the image is displayed.
|
match the display gamma before the image is displayed.
|
||||||
If your system doesn't do that, yet still seems to
|
If your system doesn't do that, yet still seems to
|
||||||
perform arithmetic on the pixels without decoding them,
|
perform arithmetic on the pixels without decoding them,
|
||||||
it is broken - check out the modes below.
|
it is broken - check out the modes below.
|
||||||
|
|
||||||
With PNG_ALPHA_STANDARD libpng always produces linear
|
With PNG_ALPHA_STANDARD libpng always produces linear
|
||||||
component values, whatever screen_gamma you supply. The
|
component values, whatever screen_gamma you supply. The
|
||||||
screen_gamma value is, however, used as a default for
|
screen_gamma value is, however, used as a default for
|
||||||
the file gamma if the PNG file has no gamma information.
|
the file gamma if the PNG file has no gamma information.
|
||||||
|
|
||||||
If you call png_set_gamma after png_set_alpha_mode you
|
If you call png_set_gamma() after png_set_alpha_mode() you
|
||||||
will override the linear encoding. Instead the
|
will override the linear encoding. Instead the
|
||||||
pre-multiplied pixel values will be gamma encoded but
|
pre-multiplied pixel values will be gamma encoded but
|
||||||
the alpha channel will still be linear. This may
|
the alpha channel will still be linear. This may
|
||||||
actually match the requirements of some broken software,
|
actually match the requirements of some broken software,
|
||||||
but it is unlikely.
|
but it is unlikely.
|
||||||
|
|
||||||
While linear 8 bit data is often used it has
|
While linear 8-bit data is often used it has
|
||||||
insufficient precision for any image with a reasonable
|
insufficient precision for any image with a reasonable
|
||||||
dynamic range. To avoid problems, and if your software
|
dynamic range. To avoid problems, and if your software
|
||||||
supports it, use png_set_expand_16() to force all
|
supports it, use png_set_expand_16() to force all
|
||||||
components to 16 bits.
|
components to 16 bits.
|
||||||
|
|
||||||
PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
|
PNG_ALPHA_OPTIMIZED: This mode is the same as PNG_ALPHA_STANDARD except that
|
||||||
completely opaque pixels are gamma encoded according to
|
completely opaque pixels are gamma encoded according to
|
||||||
the screen_gamma value. Pixels with alpha less than 1.0
|
the screen_gamma value. Pixels with alpha less than 1.0
|
||||||
will still have linear components.
|
will still have linear components.
|
||||||
|
|
||||||
Use this format if you have control over your
|
Use this format if you have control over your
|
||||||
compositing software and do don't do other arithmetic
|
compositing software and do don't do other arithmetic
|
||||||
(such as scaling) on the data you get from libpng. Your
|
(such as scaling) on the data you get from libpng. Your
|
||||||
compositing software can simply copy opaque pixels to
|
compositing software can simply copy opaque pixels to
|
||||||
the output but still has linear values for the
|
the output but still has linear values for the
|
||||||
non-opaque pixels.
|
non-opaque pixels.
|
||||||
|
|
||||||
In normal compositing, where the alpha channel encodes
|
In normal compositing, where the alpha channel encodes
|
||||||
partial pixel coverage (as opposed to broad area
|
partial pixel coverage (as opposed to broad area
|
||||||
translucency), the inaccuracies of the 8 bit
|
translucency), the inaccuracies of the 8-bit
|
||||||
representation of non-opaque pixels are irrelevant.
|
representation of non-opaque pixels are irrelevant.
|
||||||
|
|
||||||
You can also try this format if your software is broken;
|
You can also try this format if your software is broken;
|
||||||
it might look better.
|
it might look better.
|
||||||
|
|
||||||
PNG_ALPHA_BROKEN This is PNG_ALPHA_STANDARD however all component values,
|
PNG_ALPHA_BROKEN: This is PNG_ALPHA_STANDARD however all component values,
|
||||||
including the alpha channel are gamma encoded. This is
|
including the alpha channel are gamma encoded. This is
|
||||||
an appropriate format to try if your software, or more
|
an appropriate format to try if your software, or more
|
||||||
likely hardware, is totally broken: if it performs
|
likely hardware, is totally broken: if it performs
|
||||||
linear arithmetic directly on gamma encoded values.
|
linear arithmetic directly on gamma encoded values.
|
||||||
|
|
||||||
In most cases of broken software or hardware the bug in the final display
|
In most cases of broken software or hardware the bug in the final display
|
||||||
manifests as a subtle halo around composited parts of the image. You may not
|
manifests as a subtle halo around composited parts of the image. You may not
|
||||||
@ -1742,35 +1742,41 @@ separate from the background, as though it had been cut out of paper and pasted
|
|||||||
on afterward.
|
on afterward.
|
||||||
|
|
||||||
If you don't have to deal with bugs in software or hardware, or if you can fix
|
If you don't have to deal with bugs in software or hardware, or if you can fix
|
||||||
them, there are three recommended ways of using png_set_alpha_mode:
|
them, there are three recommended ways of using png_set_alpha_mode():
|
||||||
|
|
||||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG, screen_gamma);
|
png_set_alpha_mode(png_ptr, PNG_ALPHA_PNG,
|
||||||
You can do color correction on the result (libpng does not currently
|
screen_gamma);
|
||||||
support color correction internally.) When you handle the alpha channel
|
|
||||||
you need to undo the gamma encoding and multipy out the alpha.
|
|
||||||
|
|
||||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD, screen_gamma);
|
You can do color correction on the result (libpng does not currently
|
||||||
|
support color correction internally.) When you handle the alpha channel
|
||||||
|
you need to undo the gamma encoding and multiply out the alpha.
|
||||||
|
|
||||||
|
png_set_alpha_mode(png_ptr, PNG_ALPHA_STANDARD,
|
||||||
|
screen_gamma);
|
||||||
png_set_expand_16(png_ptr);
|
png_set_expand_16(png_ptr);
|
||||||
If you are using the high level interface don't call png_set_expand_16,
|
|
||||||
instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
|
|
||||||
|
|
||||||
With this mode you can't do color corrrection, but you can do arithmetic,
|
If you are using the high level interface don't call png_set_expand_16();
|
||||||
including composition and scaling, on the data without further processing.
|
instead pass PNG_TRANSFORM_EXPAND_16 to the interface.
|
||||||
|
|
||||||
png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMZED, screen_gamma);
|
With this mode you can't do color correction, but you can do arithmetic,
|
||||||
You can avoid the expansion to 16 bit components with this mode, but you
|
including composition and scaling, on the data without further processing.
|
||||||
lose the ability to scale the image or perform other linear arithmetic.
|
|
||||||
All you can do is compose the result onto a matching output. Since this
|
png_set_alpha_mode(png_ptr, PNG_ALPHA_OPTIMIZED,
|
||||||
mode is libpng specific you also need to write your own composition
|
screen_gamma);
|
||||||
software.
|
|
||||||
|
You can avoid the expansion to 16-bit components with this mode, but you
|
||||||
|
lose the ability to scale the image or perform other linear arithmetic.
|
||||||
|
All you can do is compose the result onto a matching output. Since this
|
||||||
|
mode is libpng specific you also need to write your own composition
|
||||||
|
software.
|
||||||
|
|
||||||
If you don't need, or can't handle, the alpha channel you can call
|
If you don't need, or can't handle, the alpha channel you can call
|
||||||
png_set_background to remove it by compositing against a fixed color. Don't
|
png_set_background() to remove it by compositing against a fixed color. Don't
|
||||||
call png_set_strip_alpha to do this - it will leave spurious pixel values in
|
call png_set_strip_alpha() to do this - it will leave spurious pixel values in
|
||||||
transparent parts of this image.
|
transparent parts of this image.
|
||||||
|
|
||||||
png_set_background(png_ptr, &background_color, PNG_BACKGROUND_GAMMA_SCREEN,
|
png_set_background(png_ptr, &background_color,
|
||||||
0, 1);
|
PNG_BACKGROUND_GAMMA_SCREEN, 0, 1);
|
||||||
|
|
||||||
The background_color is an RGB or grayscale value according to the data format
|
The background_color is an RGB or grayscale value according to the data format
|
||||||
libpng will produce for you. Because you don't yet know the format of the PNG
|
libpng will produce for you. Because you don't yet know the format of the PNG
|
||||||
@ -1815,7 +1821,7 @@ you want to do are limited to the following set:
|
|||||||
|
|
||||||
PNG_TRANSFORM_IDENTITY No transformation
|
PNG_TRANSFORM_IDENTITY No transformation
|
||||||
PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
|
PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to
|
||||||
8 bits
|
8-bit
|
||||||
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
|
PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel
|
||||||
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
|
PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit
|
||||||
samples to bytes
|
samples to bytes
|
||||||
@ -2379,7 +2385,7 @@ severe accuracy loss.
|
|||||||
png_set_expand_16(png_ptr);
|
png_set_expand_16(png_ptr);
|
||||||
|
|
||||||
PNG can have files with 16 bits per channel. If you only can handle
|
PNG can have files with 16 bits per channel. If you only can handle
|
||||||
8 bits per channel, this will strip the pixels down to 8 bit.
|
8 bits per channel, this will strip the pixels down to 8-bit.
|
||||||
|
|
||||||
if (bit_depth == 16)
|
if (bit_depth == 16)
|
||||||
png_set_strip_16(png_ptr);
|
png_set_strip_16(png_ptr);
|
||||||
@ -2600,10 +2606,11 @@ to convey this information, however only two combinations are like to be useful:
|
|||||||
|
|
||||||
The second call was described above - my_background is in the format of the
|
The second call was described above - my_background is in the format of the
|
||||||
final, display, output produced by libpng. Because you now know the format of
|
final, display, output produced by libpng. Because you now know the format of
|
||||||
the PNG it is possible to avoid the need to choose either 8 or 16 bit output and
|
the PNG it is possible to avoid the need to choose either 8-bit or 16-bit
|
||||||
to retain palette images (the palette colors will be modified appropriately and
|
output and to retain palette images (the palette colors will be modified
|
||||||
the tRNS chunk removed.) However, if you are doing this, take great care not to
|
appropriately and the tRNS chunk removed.) However, if you are doing this,
|
||||||
ask for transformations without checking first that they apply!
|
take great care not to ask for transformations without checking first that
|
||||||
|
they apply!
|
||||||
|
|
||||||
In the first call the background color has the original bit depth and color type
|
In the first call the background color has the original bit depth and color type
|
||||||
of the PNG file. So, for palette images the color is supplied as a palette
|
of the PNG file. So, for palette images the color is supplied as a palette
|
||||||
@ -2678,7 +2685,7 @@ This function can also be used to invert grayscale and gray-alpha images:
|
|||||||
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
||||||
png_set_invert_mono(png_ptr);
|
png_set_invert_mono(png_ptr);
|
||||||
|
|
||||||
PNG files store 16 bit pixels in network byte order (big-endian,
|
PNG files store 16-bit pixels in network byte order (big-endian,
|
||||||
ie. most significant bits first). This code changes the storage to the
|
ie. most significant bits first). This code changes the storage to the
|
||||||
other way (little-endian, i.e. least significant bits first, the
|
other way (little-endian, i.e. least significant bits first, the
|
||||||
way PCs store them):
|
way PCs store them):
|
||||||
@ -3991,7 +3998,7 @@ is required by PNG.
|
|||||||
|
|
||||||
png_set_shift(png_ptr, &sig_bit);
|
png_set_shift(png_ptr, &sig_bit);
|
||||||
|
|
||||||
PNG files store 16 bit pixels in network byte order (big-endian,
|
PNG files store 16-bit pixels in network byte order (big-endian,
|
||||||
ie. most significant bits first). This code would be used if they are
|
ie. most significant bits first). This code would be used if they are
|
||||||
supplied the other way (little-endian, i.e. least significant bits
|
supplied the other way (little-endian, i.e. least significant bits
|
||||||
first, the way PCs store them):
|
first, the way PCs store them):
|
||||||
@ -4407,7 +4414,7 @@ the simpler ones to get an idea of how they work. Try to find a similar
|
|||||||
transformation to the one you want to add and copy off of it. More details
|
transformation to the one you want to add and copy off of it. More details
|
||||||
can be found in the comments inside the code itself.
|
can be found in the comments inside the code itself.
|
||||||
|
|
||||||
.SS Configuring for 16 bit platforms
|
.SS Configuring for 16-bit platforms
|
||||||
|
|
||||||
You will want to look into zconf.h to tell zlib (and thus libpng) that
|
You will want to look into zconf.h to tell zlib (and thus libpng) that
|
||||||
it cannot allocate more then 64K at a time. Even if you can, the memory
|
it cannot allocate more then 64K at a time. Even if you can, the memory
|
||||||
|
Loading…
Reference in New Issue
Block a user