From 4e91867039cbe8ed1bf80861ecf7e019bdcdf6c2 Mon Sep 17 00:00:00 2001 From: William Kendrick Date: Thu, 9 Mar 2006 07:25:59 +0000 Subject: [PATCH] Adding Advanced Stamps HOWTO by Albert C. --- docs/ADVANCED-STAMPS-HOWTO.txt | 272 ++++++++++++++++++++++ docs/CHANGES.txt | 4 + docs/Makefile | 7 +- docs/html/ADVANCED-STAMPS-HOWTO.html | 331 +++++++++++++++++++++++++++ 4 files changed, 613 insertions(+), 1 deletion(-) create mode 100644 docs/ADVANCED-STAMPS-HOWTO.txt create mode 100644 docs/html/ADVANCED-STAMPS-HOWTO.html diff --git a/docs/ADVANCED-STAMPS-HOWTO.txt b/docs/ADVANCED-STAMPS-HOWTO.txt new file mode 100644 index 000000000..376958db0 --- /dev/null +++ b/docs/ADVANCED-STAMPS-HOWTO.txt @@ -0,0 +1,272 @@ + Tux Paint + version 0.9.16 + Advanced Staps HOWTO + + Copyright 2006 by Albert Cahalan for the Tux Paint project + New Breed Software + + albert@users.sf.net + http://www.newbreedsoftware .com/tuxpaint/ + + March 8, 2006 - March 8, 2006 + +About this HOWTO + + This HOWTO assumes that you want to make an excellent Tux Paint stamp + from a JPEG image. There are easier and faster methods that produce + lower quality. + + This HOWTO assumes you are dealing with normal opaque objects. Dealing + with semi-transparent objects (fire, moving fan blade, kid's baloon) or + light-giving objects (fire, lightbulb, sun) is best done with custom + software. Images with perfect solid-color backgrounds are also best done + with custom software, but are not troublesome to do as follows. + +Image choice is crucial + + License + + If you wish to submit artwork to the Tux Paint developers for + consideration for inclusion in the official project, or if you wish to + release your own copy of Tux Paint, bundled with your own graphics, + you need an image that is compatible with the GNU General Public + License used by Tux Paint. + + Images produced by the US government are Public Domain, but be aware + that the US government sometimes uses other images on the web. Google + image queries including either site:gov or site:mil will supply many + suitable images. (Note: the *.mil sites include non-military content, + too!) + + Your own images can be placed in the Public Domain by declaring it so. + (Hire a lawyer if you feel the need for legal advice.) + + For personal use, any image you can legitimately modify and use for + your own personal use should be fine. + + Image Size and Orientation: + + You need an image that has a useful orientation. Perspective is an + enemy. Images that show an object from the corner are difficult to fit + into a nice drawing. As a general rule, telephoto side views are the + best. The impossible ideal is that, for example, two wheels of a car + are perfectly hidden behind the other two. + + Rotating an image can make it blurry, especially if you only rotate by + a few degrees. Images that don't need rotation are best, images that + need lots of rotation (30 to 60 degrees) are next best, and images + that need just a few degrees are worst. Rotation will also make an + image darker because most image editing software is very bad about + gamma handling. (Rotation is only legitimate for gamma=1.0 images.) + + Very large images are more forgiving of mistakes, and thus easier to + work with. Choose an image with an object that is over 1000 pixels + across if you can. You can shrink this later to hide your mistakes. + + Be sure that the image is not too grainy, dim, or washed out. + + Pay attention to feet and wheels. If they are buried in something, you + will need to draw new ones. If only one is buried, you might be able + to copy the other one as a replacement. + +Prepare the image: + + First of all, be sure to avoid re-saving the image as a JPEG. This + causes quality loss. There is a special tool called jpegtran that lets + you crop an image without the normal quality loss. If you want a GUI for + it, use ljcrop. Otherwise, use it like this: + + jpegtran -trim -copy none -crop 512x1728+160+128 < src.jpg > + cropped.jpg + + Bring that image up in your image editor. If you didn't crop it yet, you + may find that your image editor is very slow. Rotate and crop the image + as needed. Save the image -- choose whatever native format supports + layers, masks, alpha, etc. GIMP users should choose "XCF", and Adobe + Photoshop users should choose "PSD", for example. + + If you have rotated or cropped the image in your image editor, flatten + it now. You need to have just one RGB layer without mask or alpha. + + Open the layers dialog box. Replicate the one layer several times. From + top to bottom you will need something like this: + + 1. unmodified image (write-protect this if you can) + 2. an image you will modify -- the "WIP" layer + 3. solid green (write-protect this if you can) + 4. solid magenta (write-protect this if you can) + 5. unmodified image (write-protect this if you can) + + Give the WIP layer a rough initial mask. You might start with a + selection, or by using the grayscale value of the WIP layer. You might + invert the mask. + + Warning: once you have the mask, you may not rotate or scale the image + normally. This would cause data loss. You will be given special scaling + instructions later. + +Prepare the mask: + + Get used to doing Ctrl-click and Alt-click on the thumbnail images in + the layers dialog. You will need this to control what you are looking at + and what you are editing. Sometimes you will be editing things you can't + see. For example, you might edit the mask of the WIP layer while looking + at the unmodified image. Pay attention so you don't screw up. Always + verify that you are editing the right thing. + + Set an unmodified image as what you will view (the top one is easiest). + Set the WIP mask as what you will edit. At some point, perhaps not + immediately, you should magnify the image to about 400% (each pixel of + the image is seen and edited as a 4x4 block of pixels on your screen). + + Select parts of the image that need to be 100% opaque or 0% opaque. If + you can select the object or background somewhat accurately by color, do + so. As needed to avoid selecting any pixels that should be partially + opaque (generally at the edge of the object) you should grow, shrink, + and invert the selection. + + Fill the 100% opaque areas with white, and the 0% opaque areas with + black. This is most easily done by drag-and-drop from the + foreground/background color indicator. You should not see anything + happen, because you are viewing the unmodified image layer while editing + the mask of the WIP layer. Large changes might be noticable in the + thumbnail. + + Now you must be zoomed in. + + Check your work. Hide the top unmodified image layer. Display just the + mask, which should be a white object on a black background (probably + with unedited grey at the edge). Now display the WIP layer normally, so + that the mask is active. This should show your object over top of the + next highest enabled layer, which should be green or magenta as needed + for maximum contrast. You might wish to flip back and forth between + those backgrounds by repeatedly clicking to enable/disable the green + layer. Fix any obvious and easy problems by editing the mask while + viewing the mask. + + Go back to viewing the top unmodified layer while editing the WIP mask. + Set your drawing tool the paintbrush. For the brush, choose a small + fuzzy circle. The 5x5 size is good for most uses. + + With a steady hand, trace around the image. Use black around the + outside, and white around the inside. Avoid making more than one pass + without switching colors (and thus sides). + + Flip views a bit, checking to see that the mask is working well. When + the WIP layer is composited over the green or magenta, you should see a + tiny bit of the original background as an ugly fringe around the edge. + If this fringe is missing, then you made the object mask too small. The + fringe consists of pixels that are neither 100% object nor 0% object. + For them, the mask should be neither 100% nor 0%. The fringe gets + removed soon. + + View and edit the mask. Select by color, choosing either black or white. + Most likely you will see unselected specks that are not quite the + expected color. Invert the selection, then paint these away using the + pencil tool. Do this operation for both white and black. + +Replace the fringe and junk pixels: + + Still viewing the mask, select by color. Choose black. Shrink the + selection by several pixels, being sure to NOT shrink from the edges of + the mask (the shrink helps you avoid and recover from mistakes). + + Now disable the mask. View and edit the unmasked WIP layer. Using the + color picker tool, choose a color that is average for the object. + Drag-and-drop this color into the selection, thus removing most of the + non-object pixels. + + This solid color will compress well and will help prevent ugly color + fringes when Tux Paint scales the image down. If the edge of the object + has multiple colors that are very different, you should split up your + selection so that you can color the nearby background to be similar. + + Now you will paint away the existing edge fringe. Be sure that you are + editing and viewing the WIP image. Frequent layer visibility changes + will help you to see what you are doing. You are likely to use all of: + + * composited over green (mask enabled) + * composited over magenta (mask enabled) + * original (the top or bottom layer) + * composited over the original (mask enabled) + * raw WIP layer (mask DISABLED) + + To reduce accidents, you may wish to select only those pixels that are + not grey in the mask. (Select by color from the mask, choose black, add + mode, choose white, invert. Alternately: Select all, select by color + from the mask, subtract mode, choose black, choose white.) If you do + this, you'll probably want to expand the selection a bit and/or hide the + "crawling ants" line that marks the selection. + + Use the clone tool and the brush tool. Vary the opacity as needed. Use + small round brushes mostly, perhaps 3x3 or 5x5, fuzzy or not. (It is + generally nice to pair up fuzzy brushes with 100% opacity and non-fuzzy + brushes with about 70% opacity.) Unusual drawing modes can be helpful + with semi-transparent objects. + + The goal is to remove the edge fringe, both inside and outside of the + object. The inside fringe, visible when the object is composited over + magenta or green, must be removed for obvious reasons. The outside + fringe must also be removed because it will become visible when the + image is scaled down. As an example, consider a 2x2 region of pixels at + the edge of a sharp-edged object. The left half is black and 0% opaque. + The right half is white and 100% opaque. That is, we have a white object + on a black background. When Tux Paint scales this to 50% (a 1x1 pixel + area), the result will be a grey 50% opaque pixel. The correct result + would be a white 50% opaque pixel. To get this result, we would paint + away the black pixels. They matter, despite being 0% opaque. + + Tux Paint can scale images down by a very large factor, so it is + important to extend the edge of your object outward by a great deal. + Right at the edge of your object, you should be very accurate about + this. As you go outward away from the object, you can get a bit sloppy. + It is reasonable to paint outward by a dozen pixels or more. The farther + you go, the more Tux Paint can scale down without creating ugly color + fringes. For areas that are more than a few pixels away from the object + edge, you should use the pencil tool (or sloppy select with + drag-and-drop color) to ensure that the result will compress well. + +Save the image for Tux Paint + + It is very easy to ruin your hard work. Image editors can silently + destroy pixels in 0% opaque areas. The conditions under which this + happens may vary from version to version. If you are very trusting, you + can try saving your image directly as a PNG. Be sure to read it back in + again to verify that the 0% opaque areas didn't turn black or white, + which would create fringes when Tux Paint scales the image down. If you + need to scale your image to save space (and hide your mistakes), you are + almost certain to destroy all the 0% opaque areas. So here is a better + way... + + A Safer Way to Save: + + Drag the mask from the layers dialog to the unused portion of the + toolbar (right after the last drawing tool). This will create a new + image consisting of one layer that contains the mask data. Scale this + as desired, remembering the settings you use. Often you should start + with an image that is about 700 to 1500 pixels across, and end up with + one that is 300 to 400. + + Save the mask image as a NetPBM portable greymap (".pgm") file. (If + you are using an old release of The GIMP, you might need to convert + the image to greyscale before you can save it.) Choose the more + compact "RAW PGM" format. (The second character of the file should be + the ASCII digit "5", hex byte 0x35.) + + You may close the mask image. + + Going back to the multi-layer image, now select the WIP layer. As you + did with the mask, drag this from the layers dialog to the toolbar. + You should get a single-layer image of your WIP data. If the mask came + along too, get rid of it. You should be seeing the object and the + painted-away surroundings, without any mask thumbnail in the layers + dialog. If you scaled the mask, then scale this image in exactly the + same way. Save this image as a NetPBM portable pixmap (".ppm") file. + (Note: ppm, not pgm.) (If you choose the RAW PPM format, the second + byte of the file should be the ASCII digit "6", hex byte 0x36.) + + Now you need to merge the two files into one. Do that with the + pnmtopng command, like this: + + pnmtopng -force -compression 9 -alpha mask.pgm fg.ppm > + final-stamp.png diff --git a/docs/CHANGES.txt b/docs/CHANGES.txt index d225bd8c8..a2a4b5607 100644 --- a/docs/CHANGES.txt +++ b/docs/CHANGES.txt @@ -86,6 +86,10 @@ $Id$ --------------------------- * Moved "Extending Tux Paint" into its own separate document. + * Created an Advanced Stamps HOWTO (documenting how to create + stamp PNGs that scale well without edge fringing). + Albert Cahalan + * Compiling, porting and packaging updates: ----------------------------------------- * Split parts of "tuxpaint.c" into separate source files: diff --git a/docs/Makefile b/docs/Makefile index 9ca3c2c51..b3de55d23 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -12,13 +12,14 @@ LINKS=links -dump -no-numbering -no-references -all: README.txt OPTIONS.txt FAQ.txt EXTENDING.txt +all: README.txt OPTIONS.txt FAQ.txt EXTENDING.txt ADVANCED-STAMPS-HOWTO.txt clean: -rm README.txt -rm OPTIONS.txt -rm FAQ.txt -rm EXTENDING.txt + -rm ADVANCED-STAMPS-HOWTO.txt README.txt: html/README.html $(LINKS) $< > $@ @@ -32,3 +33,7 @@ FAQ.txt: html/FAQ.html EXTENDING.txt: html/EXTENDING.html $(LINKS) $< > $@ +ADVANCED-STAMPS-HOWTO.txt: html/ADVANCED-STAMPS-HOWTO.html + $(LINKS) $< > $@ + + diff --git a/docs/html/ADVANCED-STAMPS-HOWTO.html b/docs/html/ADVANCED-STAMPS-HOWTO.html new file mode 100644 index 000000000..ca7d15a55 --- /dev/null +++ b/docs/html/ADVANCED-STAMPS-HOWTO.html @@ -0,0 +1,331 @@ + +Tux Paint Advanced Stamps HOWTO + + + + + +
+


+version + +0.9.16 + +
+Advanced Staps HOWTO

+ +

Copyright 2006 by Albert Cahalan for the Tux Paint project
+New Breed Software

+

albert@users.sf.net
+http://www.newbreedsoftware +.com/tuxpaint/

+ +

March 8, 2006 - March 8, 2006

+
+ + +

About this HOWTO

+
+ +

This HOWTO assumes that you want to make an excellent Tux Paint + stamp from a JPEG image. There are easier and faster methods that + produce lower quality.

+ +

This HOWTO assumes you are dealing with normal opaque objects. Dealing + with semi-transparent objects (fire, moving fan blade, kid's baloon) + or light-giving objects (fire, lightbulb, sun) is best done with custom + software. Images with perfect solid-color backgrounds are also best done + with custom software, but are not troublesome to do as follows.

+ +
+ +

Image choice is crucial

+
+ +

License

+
+ +

If you wish to submit artwork to the Tux Paint developers for + consideration for inclusion in the official project, or if you wish to + release your own copy of Tux Paint, bundled with your own graphics, + you need an image that is compatible with the GNU + General Public License used by + Tux Paint.

+ +

Images produced by the US government are Public Domain, but be aware + that the US government sometimes uses other images on the web. + Google image queries including + either site:gov or site:mil will supply many + suitable images. (Note: the *.mil sites include non-military content, + too!)

+ + Your own images can be placed in the Public Domain by declaring it + so. (Hire a lawyer if you feel the need for legal advice.)

+ +

For personal use, any image you can legitimately modify and use + for your own personal use should be fine.

+ +
+ +

Image Size and Orientation:

+
+ +

You need an image that has a useful orientation. Perspective is + an enemy. Images that show an object from the corner are difficult to + fit into a nice drawing. As a general rule, telephoto side views are + the best. The impossible ideal is that, for example, two wheels of a + car are perfectly hidden behind the other two.

+ +

Rotating an image can make it blurry, especially if you only rotate by + a few degrees. Images that don't need rotation are best, images that need + lots of rotation (30 to 60 degrees) are next best, and images that need + just a few degrees are worst. Rotation will also make an image darker + because most image editing software is very bad about gamma handling. + (Rotation is only legitimate for gamma=1.0 images.)

+ +

Very large images are more forgiving of mistakes, and thus easier to + work with. Choose an image with an object that is over 1000 pixels + across if you can. You can shrink this later to hide your mistakes.

+ +

Be sure that the image is not too grainy, dim, or washed out.

+ +

Pay attention to feet and wheels. If they are buried in something, + you will need to draw new ones. If only one is buried, you might be + able to copy the other one as a replacement.

+ +
+
+ +

Prepare the image:

+
+ +

First of all, be sure to avoid re-saving the image as a JPEG. This causes + quality loss. There is a special tool called + jpegtran + that lets you crop an image without the normal quality loss. If you want a + GUI for it, use + ljcrop. + Otherwise, use it like this:

+ +
+

jpegtran -trim -copy none -crop 512x1728+160+128 < src.jpg + > cropped.jpg

+
+ +

Bring that image up in your image editor. If you didn't crop it yet, + you may find that your image editor is very slow. Rotate and crop the + image as needed. Save the image — choose whatever native format + supports layers, masks, alpha, etc. GIMP + users should choose "XCF", and Adobe Photoshop users should choose "PSD", + for example.

+ +

If you have rotated or cropped the image in your image editor, flatten + it now. You need to have just one RGB layer without mask or + alpha.

+ +

Open the layers dialog box. Replicate the one layer several times. + From top to bottom you will need something like this:

+ +
    +
  1. unmodified image (write-protect this if you can) +
  2. an image you will modify — the "WIP" layer +
  3. solid green (write-protect this if you can) +
  4. solid magenta (write-protect this if you can) +
  5. unmodified image (write-protect this if you can) +
+ +

Give the WIP layer a rough initial mask. You might start with a + selection, or by using the grayscale value of the WIP layer. You might + invert the mask.

+ +

Warning: once you have the mask, you may not rotate or + scale the image normally. This would cause data loss. You will be + given special scaling instructions later.

+ +
+ +

Prepare the mask:

+
+ +

Get used to doing Ctrl-click and Alt-click on the thumbnail images in the + layers dialog. You will need this to control what you are looking at and + what you are editing. Sometimes you will be editing things you can't see. + For example, you might edit the mask of the WIP layer while looking at the + unmodified image. Pay attention so you don't screw up. Always verify that + you are editing the right thing.

+ +

Set an unmodified image as what you will view (the top one is easiest). + Set the WIP mask as what you will edit. At some point, perhaps not + immediately, you should magnify the image to about 400% (each pixel of + the image is seen and edited as a 4x4 block of pixels on your screen).

+ +

Select parts of the image that need to be 100% opaque or 0% opaque. + If you can select the object or background somewhat accurately by + color, do so. As needed to avoid selecting any pixels that should be + partially opaque (generally at the edge of the object) you should + grow, shrink, and invert the selection.

+ +

Fill the 100% opaque areas with white, and the 0% opaque areas with + black. This is most easily done by drag-and-drop from the + foreground/background color indicator. You should not see anything happen, + because you are viewing the unmodified image layer while editing the mask + of the WIP layer. Large changes might be noticable in the thumbnail.

+ +

Now you must be zoomed in.

+ +

Check your work. Hide the top unmodified image layer. Display just the + mask, which should be a white object on a black background (probably + with unedited grey at the edge). Now display the WIP layer normally, so + that the mask is active. This should show your object over top of the + next highest enabled layer, which should be green or magenta as needed + for maximum contrast. You might wish to flip back and forth between + those backgrounds by repeatedly clicking to enable/disable the green + layer. Fix any obvious and easy problems by editing the mask while + viewing the mask.

+ +

Go back to viewing the top unmodified layer while editing the WIP mask. + Set your drawing tool the paintbrush. For the brush, choose a small fuzzy + circle. The 5x5 size is good for most uses.

+ +

With a steady hand, trace around the image. Use black around the outside, + and white around the inside. Avoid making more than one pass without + switching colors (and thus sides).

+ +

Flip views a bit, checking to see that the mask is working well. When + the WIP layer is composited over the green or magenta, you should see a + tiny bit of the original background as an ugly fringe around the edge. + If this fringe is missing, then you made the object mask too small. + The fringe consists of pixels that are neither 100% object nor 0% object. + For them, the mask should be neither 100% nor 0%. The fringe gets removed + soon.

+ +

View and edit the mask. Select by color, choosing either black or white. + Most likely you will see unselected specks that are not quite the expected + color. Invert the selection, then paint these away using the pencil tool. + Do this operation for both white and black.

+ +
+ +

Replace the fringe and junk pixels:

+
+ +

Still viewing the mask, select by color. Choose black. Shrink the + selection by several pixels, being sure to NOT shrink from the edges of + the mask (the shrink helps you avoid and recover from mistakes).

+ +

Now disable the mask. View and edit the unmasked WIP layer. Using the + color picker tool, choose a color that is average for the object. + Drag-and-drop this color into the selection, thus removing most of the + non-object pixels.

+ +

This solid color will compress well and will help prevent ugly color + fringes when Tux Paint scales the image down. If the edge of the + object has multiple colors that are very different, you should split up + your selection so that you can color the nearby background to be + similar.

+ +

Now you will paint away the existing edge fringe. Be sure that you are + editing and viewing the WIP image. Frequent layer visibility changes will + help you to see what you are doing. You are likely to use all of:

+ +
    +
  • composited over green (mask enabled) +
  • composited over magenta (mask enabled) +
  • original (the top or bottom layer) +
  • composited over the original (mask enabled) +
  • raw WIP layer (mask DISABLED) +
+ +

To reduce accidents, you may wish to select only those pixels that are + not grey in the mask. (Select by color from the mask, choose black, add + mode, choose white, invert. Alternately: Select all, select by color from + the mask, subtract mode, choose black, choose white.) If you do this, + you'll probably want to expand the selection a bit and/or hide the + "crawling ants" line that marks the selection.

+ +

Use the clone tool and the brush tool. Vary the opacity as needed. + Use small round brushes mostly, perhaps 3x3 or 5x5, fuzzy or not. + (It is generally nice to pair up fuzzy brushes with 100% opacity and + non-fuzzy brushes with about 70% opacity.) Unusual drawing modes can be + helpful with semi-transparent objects.

+ +

The goal is to remove the edge fringe, both inside and outside of + the object. The inside fringe, visible when the object is composited + over magenta or green, must be removed for obvious reasons. The + outside fringe must also be removed because it will become visible + when the image is scaled down. As an example, consider a 2x2 region of + pixels at the edge of a sharp-edged object. The left half is black + and 0% opaque. The right half is white and 100% opaque. That is, we + have a white object on a black background. When Tux Paint scales this + to 50% (a 1x1 pixel area), the result will be a grey 50% opaque pixel. + The correct result would be a white 50% opaque pixel. To get this + result, we would paint away the black pixels. They matter, despite + being 0% opaque.

+ +

Tux Paint can scale images down by a very large factor, so it is + important to extend the edge of your object outward by a great deal. + Right at the edge of your object, you should be very accurate about this. + As you go outward away from the object, you can get a bit sloppy. It is + reasonable to paint outward by a dozen pixels or more. The farther you go, + the more Tux Paint can scale down without creating ugly color fringes. + For areas that are more than a few pixels away from the object edge, you + should use the pencil tool (or sloppy select with drag-and-drop color) to + ensure that the result will compress well.

+
+ +

Save the image for Tux Paint

+
+ +

It is very easy to ruin your hard work. Image editors can silently + destroy pixels in 0% opaque areas. The conditions under which this + happens may vary from version to version. If you are very trusting, + you can try saving your image directly as a PNG. Be sure to read it + back in again to verify that the 0% opaque areas didn't turn black or + white, which would create fringes when Tux Paint scales the image down. + If you need to scale your image to save space (and hide your mistakes), you + are almost certain to destroy all the 0% opaque areas. So here is a better + way...

+ +

A Safer Way to Save:

+
+ +

Drag the mask from the layers dialog to the unused portion of + the toolbar (right after the last drawing tool). This will create a + new image consisting of one layer that contains the mask data. Scale + this as desired, remembering the settings you use. Often you should + start with an image that is about 700 to 1500 pixels across, and end + up with one that is 300 to 400.

+ +

Save the mask image as a NetPBM portable greymap (".pgm") + file. (If you are using an old release of The GIMP, you might need + to convert the image to greyscale before you can save it.) Choose the + more compact "RAW PGM" format. (The second character of the file + should be the ASCII digit "5", hex byte 0x35.)

+ +

You may close the mask image.

+ +

Going back to the multi-layer image, now select the WIP layer. As you + did with the mask, drag this from the layers dialog to the toolbar. You + should get a single-layer image of your WIP data. If the mask came along + too, get rid of it. You should be seeing the object and the painted-away + surroundings, without any mask thumbnail in the layers dialog. If you + scaled the mask, then scale this image in exactly the same way. Save + this image as a NetPBM portable pixmap (".ppm") file. + (Note: ppm, not pgm.) (If you choose the RAW PPM format, the + second byte of the file should be the ASCII digit "6", hex byte 0x36.)

+ +

Now you need to merge the two files into one. Do that with the + pnmtopng command, like + this:

+ +

+ pnmtopng -force -compression 9 -alpha mask.pgm fg.ppm > + final-stamp.png +

+
+
+ + +