Bmp2eps converts from BMP/GIF/PNG/JPEG/PNM/TGA to PS/EPS/PDF. So what? you might ask, so do many other programs.
The main claim to fame of bmp2eps is that JPEG images are never decompressed then recompressed, they are simply transferred straight to PostScript or PDF, both of which support JPEG's compression algorithm, without further, potentially lossy, decompression and recompression. It is also the case that bmp2eps tries to make its output as small as possible. In many cases it can produce EPS files which are smaller than the GIFs on which they are based. In 2012 I produced a comparison of how programs treat JPEGs.
The program is distributed as source, and needs remarkably few libraries, just zlib and libpng. It will build without libpng, but then uses a poorer internal PNG reader. It will even build without zlib, but its compression becomes much poorer at that point, and the number of PNG files it can read decreases further. Both Linux and MacOS usually have both these libraries, whereas libpng seems troublesome in many Windows environments.
The program for performing the opposite conversion, that of finding JPEG images in PostScript files, and extracting them to JPEGs without any decompression and recompression stages, is psimages, which relies on ghostscript. For the same applied to PDF files, it is pdfimages from xpdf.
Some may be upset by the name. I changed from jpeg2eps to bmp2eps in 2003, when support for gif, pnm and bmp was first added. The code was not widely known or distributed back then (it was known to around a hundred people). I had written jpeg2eps in March 2001. Yes, it has taken nine years for me to bother to release this under the GPL! There are now other utilities of overlapping functionality, which have been developed entirely independently of this code.
Some of this code is re-used in the excellent plotting package PyXPlot.
An excerpt from the included Changelog
1.18 to 1.19
------------
Added basic png reader for use if libpng absent.
Squashed minor read/write past buffer end problems in several predictors.
Added "-i" flag for use internal png reader.
Added "-R" flag, for use PNG data unchanged -- PNG without zlib.
Fixed transparency bug in PNG output for non-paletted RGB images.
1.17 to 1.18
------------
Fixed problem reading BMP files with bitfields and V2 (or greater) headers.
Add support for 32 bit BMP files.
1.16 to 1.17
------------
Added PNG output.
Rewrote PNG predictors to cope with depths less than 8 bits per pixel.
Try prediction ("Up" only) for 4 bit greyscale output in eps and pdf.
1.15 to 1.16
------------
Add "Sub", "Av" and "Paeth" predictors.
Predictors can be selected with -P=n
1.12 to 1.15
------------
read_image.c split out from bmp2eps.c.
Prediction becomes the default, rather than enabled with -P.
Bug which prevented the reading of GIF89a images squashed.
1.10 to 1.12
------------
Rewrote LZW code to be ten times faster.
Add output buffer length parameter to to_lzw.
Added "Up" predictor for LZW/Flate compression of 8/24 bit unpaletted images.
1.01 to 1.10
------------
Check generated DCT (JPEG) data for correctness, detecting truncation.
Remove trailing "garbage" from JPEGs.
Added CCITT Group 4 compression, and -G3 and -G4 switches.
Rewrote CCITT Group 3 compression to integrate with G4 efficiently.
CCITT Group 3 code no longer emits EOLs. Change #def in ccitt.c to restore.
RLE now defaults to G4 if bit depth is one.
Fixed typo in hex-encoded output -- did this ever work?!
Accept ASCII PGMs with EOF immediately following last data item.
Changed Makefile to use system libpng on MacOS.
1.00 to 1.01
------------
Handle greyscale PNGs with alpha channel and no background colour correctly.
If user requests transparancy ignored, ignore alpha channel in PNGs.
Reduce 8 bit greyscale to 1, 2 or 4 bit where possible.
Removed debugging output from ASCII pbm/pgm/ppm reader.
Mask added to debug=image->flags&DEBUG_MASK everywhere.
This code has nothing to do with the University which happens to give its author a stipend. It is provided with no form of warrenty or statement of fitness for purpose, but merely under version two of the Gnu Public Licence.