The simple filter graph shown in the applet demonstrates a simple technique to at least reduce the purple fringing. The role of the special PurpleDetectionFilter is to detect image areas where the blue color component is larger than both the red and green components, with the required level-difference settable via the property-sheet. (Naturally, this filter could also have been constructed from multiple individual filters, but it seemed simpler to just write another Java class.)
The output of the PurpleDetectionFilter is a mask image, where 'purple' pixels in the original image are set to white, and the remaining pixels set to black. The mask image is then multiplied with a constant (blue) color (giving a blue mask image), which is then simply subtracted from the original input image. As you can see, this simple filter cascade reduces the purple fringing by a large amount.
Naturally, the simple algorithm shown here does not work very well when your input image contains purple areas that are real and not just imaging artifacts. A simple strategy to handle such cases are to restrict the PurpleDetectionFilter to a smaller region of the input image. A more complex algorithm would be to try combining the purple-detection with an edge-detection algorithm.
Run the applet | Run the editor (via Webstart)