PngMinus -------- (copyright Willem van Schaik, 1999-2019) Some history ------------ Soon after the creation of PNG in 1995, the need was felt for a set of pnmtopng / pngtopnm utilities. Independently Alexander Lehmann and I (Willem van Schaik) started such a project. Luckily we discovered this and merged the two, which later became part of NetPBM, available from SourceForge. These two utilities have many, many options and make use of most of the features of PNG, like gamma, alpha, sbit, text-chunks, etc. This makes the utilities quite complex and by now not anymore very maintainable. When we wrote these programs, libpng was still in an early stage. Therefore, lots of the functionality that we put in our software can now be done using transform-functions in libpng. Finally, to compile these programs, you need to have installed and compiled three libraries: libpng, zlib and netpbm. Especially the latter makes the whole setup a bit bulky. But that's unavoidable given the many features of pnmtopng. What now (1999) --------------- At this moment libpng is in a very stable state and can do much of the work done in pnmtopng. Also, pnmtopng needs to be upgraded to the new interface of libpng. Hence, it is time for a rewrite from the ground up of pnmtopng and pngtopnm. This will happen in the near future (stay tuned). The new package will get a different name to distinguish it from the old one: PngPlus. To experiment a bit with the new interface of libpng, I started off with a small prototype that contains only the basic functionality. It doesn't have any of the options to read or write special chunks and it will do no gamma correction. But this makes it also a simple program that is quite easy to understand and can serve well as a template for other software developments. By now there are of course a couple of programs, like Greg Roelofs' rpng/wpng, that can be used just as good. Can and can not --------------- As this is the small brother of the future PngPlus, I called this fellow PngMinus. Because I started this development in good-old Turbo-C, I avoided the use the netpbm library, which requires DOS extenders. Again, another reason to call it PngMinus (minus netpbm :-). So, part of the program are some elementary routines to read / write pgm- and ppm-files. It does not handle B&W pbm-files, but instead you could do pgm with bit- depth 1. The downside of this approach is that you can not use them on images that require blocks of memory bigger than 64k (the DOS version). For larger images you will get an out-of-memory error. As said before, PngMinus doesn't correct for gamma. When reading png-files you can do this just as well by piping the output of png2pnm to pnmgamma, one of the standard PbmPlus tools. This same scenario will most probably also be followed in the full-blown future PngPlus, with the addition of course of the possibility to create gamma-chunks when writing png-files. On the other hand it supports alpha-channels. When reading a png-image you can write the alpha-channel into a pgm-file. And when creating an RGB+A png-image, you just combine a ppm-file with a corresponding pgm-file containing the alpha-channel. When reading, transparency chunks are converted into an alpha-channel and from there on treated the same way. Finally you can opt for writing ascii or binary pgm- and ppm-files. When the bit-depth is 16, the format will always be ascii. Using it -------- To distinguish them from pnmtopng and PngPlus, the utilities are named png2pnm and pnm2png (2 instead of to). The input- and output-files can be given as parameters or through redirection. Therefore the programs can be part of a pipe. To list the options type "png2pnm -h" or "pnm2png -h". Just like Scandinavian furniture -------------------------------- You have to put it together yourself. I developed the software on MS-DOS with Turbo-C 3.0 and RedHat Linux 4.2 with gcc. In both cases I used libpng-1.0.4 and zlib-1.1.3. By now (2019) it is twenty years later and more current versions are OK. The makefile assumes that the libpng libraries can be found in ../.. and libz in ../../../zlib. But you can change this to for example ../libpng and ../zlib. The makefile creates two versions of each program, one with static library support and the other using shared libraries. If you create a ../pngsuite directory and then store the basn####.png files from PngSuite (http://www.schaik.com/pngsuite/) in there, you can test the proper functioning of PngMinus by running pngminus.sh. Warranty ------- Please, remember that this was just a small experiment to learn a few things. It will have many unforeseen features ... who said bugs? Use it when you are in need for something simple or when you want a starting point for developing your own stuff. The end ------- Willem van Schaik mailto:willem at schaik dot com http://www.schaik.com/png/ Oct 1999, Jan 2019