Use can use java.awt.image.RescaleOp:
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.net.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class InvertExample implements Runnable {
public void run() {
BufferedImage original = getOrginalImage();
BufferedImage rotated = invert(original);
JPanel p = new JPanel();
p.add(new JLabel(new ImageIcon(original)));
p.add(new JLabel(new ImageIcon(rotated)));
JFrame f = new JFrame("InvertExample");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public BufferedImage getOrginalImage() {
try {
return ImageIO.read(new URL("http://blogs.sun.com/jag/resource/JagHeadshot-small.jpg"));
} catch (IOException e) {
throw new RuntimeException(e); //lazy
}
}
public BufferedImage invert(BufferedImage image) {
int w = image.getWidth();
int h = image.getHeight();
BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
RescaleOp op = new RescaleOp(-1, 255, null);
return op.filter(image, newImage);
}
public static void main(String[] args) {
EventQueue.invokeLater(new InvertExample());
}
}
This doesn't work for IndexColorModels.