2012-04-18 2 views
2

Я делаю приложение в платформе netbeans с помощью java swing Technology.I хочу сделать обработку изображения на захваченном изображении. Это изображение захвачено рентгеновским пистолетом. После этого я хочу увеличить/уменьшить яркость изображения с помощью JSlider.I сделал это используя метод paintComponent (Graphics g). но я хочу сделать прямой эффект увеличения/уменьшения яркости изображения без использования метода paintComponenet (Graphics g). Как я могу это сделать? Мой код показан ниже. В моем коде я использую класс PlanarImage и BufferedImage библиотеки JAI для загрузки .tiff imge, после чего я использую событие statechange объекта JSlider для увеличения/уменьшения яркости изображения.Как увеличить/уменьшить яркость изображения с помощью JSlider в java?

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: \\ ява \\ aimages \\ batman.jpg"' Ммм .. то есть ** JPEG ** –

+0

ооо.. извините, сэр, моя ошибка. я обновляю свой код и проверяю его. Если у вас есть какие-либо идеи об этом, то поделитесь со мной. – Jay

+0

@AndrewThompson обратитесь пожалуйста. http://stackoverflow.com/questions/10208255/how-to-increase-decrease-brightness-of-image-using-jslider-in-java – Jay

ответ

4

Не ясно, почему вы хотите избежать paintComponent(), но вы всегда можете изменить BufferedImage в JLabel «s ImageIcon с помощью 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

+0

благодарю вас за помощь. это работает. – Jay