¿Cómo boost / disminuir el brillo de la imagen usando JSlider en java?

Estoy haciendo la aplicación en la plataforma netbeans usando la tecnología java swing. Quiero hacer el procesamiento de imágenes en una imagen capturada. Esta imagen es capturada por X-Ray Gun. Después de eso quiero boost / disminuir el brillo de la imagen usando JSlider.He hecho esto usando paintComponent (Gráficos g) método. pero quiero hacer un efecto directo de los shinys aumentados / disminuidos de la imagen sin usar el método paintComponenet (Graphics g). ¿Cómo puedo hacer eso? Mi código se muestra a continuación. En mi código uso la clase PlanarImage y BufferedImage de la biblioteca JAI para cargar .tiff imge y luego uso el evento statechange del objeto JSlider para boost / disminuir el brillo de la imagen.

enter code here import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class Main extends JPanel implements ChangeListener { RescaleOp op; PlanarImage image = JAI.create("fileload", "F:\\java\\aimages\\teeth1.tiff"); BufferedImage bufferedImage = image.getAsBufferedImage(); BufferedImage bImage; int x1 = bufferedImage.getWidth(); int y1 = bufferedImage.getHeight(); JSlider slider = new JSlider(-10, 10); public Main() { bImage=bufferedImage; slider.addChangeListener(this); this.add(slider, BorderLayout.class); // this.add(new JLabel(new ImageIcon(bufferedImage)), BorderLayout.NORTH); } @Override protected void paintComponent(Graphics g) { g.drawImage(bufferedImage, 0, 0, x1, y1, null); } public static void main(String[] argv) throws Exception { JFrame jFrame = new JFrame(); jFrame.add(new Main()); jFrame.setVisible(true); jFrame.setSize(200, 200); jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void stateChanged(ChangeEvent e) { JSlider slid = (JSlider) e.getSource(); float value = (float) slid.getValue(); setValue(value); } private void setValue(float value) { bufferedImage=bImage; float scaleFactor = (float) (1.0 + (value / 10.0)); op = new RescaleOp(scaleFactor, 0, null); bufferedImage = op.filter(bufferedImage, null); repaint(); } } 

No está claro por qué quiere evitar paintComponent() , pero siempre puede alterar la imagen BufferedImage en un ImageIcon JLabel usando RescaleOp .

Adición: me parece que no quiere sobrescribir la imagen original, así que, naturalmente, tiene sentido alterar una copia. Lamentablemente, su ejemplo simplemente copia una referencia al original. En su lugar, use dos copias, pasando el original como src y la copia como dst , como se muestra en el ejemplo a continuación. Ver también AlphaTest .

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * @see https://stackoverflow.com/q/10208255/230513 * @see https://stackoverflow.com/questions/5838842 * @see https://stackoverflow.com/questions/5864490 */ public class RescaleTest extends JPanel implements ChangeListener { private static final String NAME = "image.jpg"; private BufferedImage image, copy; private JSlider slider = new JSlider(); public RescaleTest() { PlanarImage pi = JAI.create("fileload", NAME); image = pi.getAsBufferedImage(); copy = pi.getAsBufferedImage(); this.setLayout(new BorderLayout()); this.add(new JLabel(new ImageIcon(copy))); this.add(slider, BorderLayout.SOUTH); slider.setValue(slider.getMaximum() / 2); slider.addChangeListener(this); } @Override public void stateChanged(ChangeEvent e) { float value = (float) slider.getValue(); float scaleFactor = 2 * value / slider.getMaximum(); RescaleOp op = new RescaleOp(scaleFactor, 0, null); copy = op.filter(image, copy); repaint(); } private void display() { JFrame f = new JFrame("RescaleTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new RescaleTest().display(); } }); } }