2012-04-18 50 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