Hmmm.
To be honest, I think what is needed is a new set export datatypes. This would work in parallel with the existing system until a better overall replacement is written. You'd still have a similar heirarchy and methods.
The main difference is that you'd be able to have some base data in memory along with a description (for instance an image would have width, height, modulus, pixel format etc).
The information in the above example could be passed to a root exportpicture.datatype which in turn could be used to obtain a list of all the installed child types that can encode and export this data.
The data in the list would give you the name and various capabilities of each datatype.
Now, encoding is fundamentally more complex than decoding as far as parameters goes since knowledge of the format is needed. By obtaining the capabilities of a specific datatype you might be able to set some type specific properties. This isn't really ideal for a simple OOP type encoder strategy though.
However, you could simplify all this down to a set of options that can be represented as simple values in the parent interface. We might have, for the exportpicture.datatype generic export properties such as
resolution (DPI perhaps)
compression 0...100
quality 0...100
maximum colours 2...2^32 (or whatever)
It would be up to the specific exporting datatype to interpret these. Some may ignore them all together. There'd probably be a few more properties than those above. The point is, the programmer is sheilded from some unwanted complexities.