Why bother with a wrapper? Because System.Drawing doesn't like PCX and I like a challenge.
I wonder if one can get palette indices from a System.Drawing.Bitmap's image data... like, if you have an image -- a BMP, PNG, or GIF -- with three black entries in its palette, can you tell that this black pixel is color #2 and this other black pixel is color #3? Cos that's the kind of uncertainty that made me read BMP files by hand in this project.
Update: okay, so you can in fact get that data from a Bitmap, through LockBits of all methods. Nasty, and it only plays nice (and to our needs) on 8-bit images... but then why would you put a 4-or-less-bit image in there, hmm? But, the cool part is, besides the lack of PCX support, you can just load whatever System.Drawing supports and see if PixelFormat == PixelFormat.Format8bppIndexed. From then on, things like PNG/GIF compression and BMP being upside-down don't matter. So if I were to make a wrapper and add PCX support, I'd lockbit up a copy of the raw pixels for those three, and return the same manually for PCX.
Update: I now have a method that, given a filename, a 64000-byte target array, and an optional 768-byte palette array, returns the same right-side-up raw pixel data for any 256-color image that System.Drawing supports, plus PCX.