2012-04-18 49 views
2

余米使用的Java Swing Technology.I在NetBeans平台应用使得想要做图像处理oncaptured image.This图像是由X射线Gun.after捕捉,我想用JSlider.I做到了这一点,以提高图像的/降低亮度使用paintComponent(Graphics g)方法。但我想做的直接影响增加/减少图像brightnees而不使用paintComponenet(Graphics g)method.so我该怎么做?我的代码如下所示。在我的代码中,我使用JAI库的PlanarImage和BufferedImage类来加载.tiff图像,之后我使用JSlider对象的statechange事件来增加/减少图像的亮度。如何在java中使用JSlider增加/减少图像的亮度?

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(); 

} 
} 
+0

* “为负载.TIFF IMGE” * ..' “F:\\ \\的Java \\ aimages batman.jpg”'嗯..这是** ** JPEG – 2012-04-18 11:40:29

+0

哦~~。对不起,先生,我的错误。我更新我的代码并检查它。如果你对此有任何想法,请与我分享。 – Jay 2012-04-18 11:56:26

+0

@AndrewThompson请参考这个。 http://stackoverflow.com/questions/10208255/how-to-increase-decrease-brightness-of-image-using-jslider-in-java – Jay 2012-04-18 12:09:45

回答

4

为什么要避免paintComponent()目前尚不清楚,但你总是可以改变BufferedImageJLabelImageIcon使用RescaleOp

附录:我听起来像是你不想覆盖原始图像,所以自然是有意义的改变副本。不幸的是,你的例子只是将引用复制到原始文件中。相反,请使用两个副本,将原件传递为src,将副本传递为dst,如下面的示例所示。另见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(); 
      } 
     }); 
    } 
} 
+0

我想避免的paintComponent(),因为我原来的计划,我得到的图像路径来自JTree的节点。意味着我采取树节点的路径,然后我打开该图像,然后我想增加/降低图像的亮度。如果我使用paintComponent,那么它会覆盖我的应用程序图像和客户看到双冲突image.so。我想避免这种方法。如果您有任何解决方案,请与我分享。 – Jay 2012-04-18 12:02:32

+0

谢谢你对我的帮助。是工作。 – Jay 2012-04-19 06:10:26