繁体   English   中英

使用Jslider增大/减小图像的亮度不起作用

[英]Increase/Decrease Brightness of Image using Jslider not working

Jslider工作正常,但未发生图像过滤。请帮助我找出此代码中的错误。是否还有其他方法可以更改图像的亮度? 如果是这样,请更改代码,但使用jslider时应增加或减少亮度。

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.imageio.ImageIO;
import java.io.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;

public class Bright extends JFrame 
{
    Dimension screenwidth=getToolkit().getScreenSize();
    int mx=(int)screenwidth.getWidth(); 
    int my=(int)screenwidth.getHeight();
    BufferedImage picture1;
    JLabel label3;
    int neww;
    int newh;
    float[] scales = { 0.5f,1f, 1f, 1f };
    float[] offsets = new float[4];
    RescaleOp rescale;

    public Bright()
    {
        JFrame f = new JFrame("Image Editor v1.0");
        f.setLayout(null);
        try{
            File file=new File("e:\\8.jpg");
            picture1=ImageIO.read(file);
        }catch(Exception e)
        {
        }

        JPanel panel2 = new JPanel(); // create GUI to load image i.e picture1
        panel2.setLayout(null);
        panel2.setBounds(101,20,mx-100,my-20);
        f.add(panel2);
        label3 = new JLabel("");

        panel2.add(label3);
        f.setExtendedState(Frame.MAXIMIZED_BOTH);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        createimage();
        brightness();
    }

    public void brightness()
    {
        JSlider slider=new JSlider(0,100);
        JPanel sliderpanel = new JPanel();     
        JFrame frame1 = new JFrame();

        frame1.setTitle("Vertical JSlider");
        frame1.setContentPane(sliderpanel);
        frame1.setVisible(true);

        slider.addChangeListener(new ChangeListener() 
            {
                @Override
                public void stateChanged(ChangeEvent e) {
                    // TODO Auto-generated method stub
                    JSlider slider = (JSlider)e.getSource();
                    System.out.println("Slider: "+slider.getValue());
                    float value = (float) slider.getValue()/100f;
                    scales[3]=value;
                    rescale = new RescaleOp(scales,offsets, null);
                    rescale.filter(picture1,picture1); // what problem is here ??
                }   
            });                     

        frame1.add(slider);

        frame1.setSize(550,100);
        createimage();
    }

    public void createimage()
    {
        BufferedImage bi = null;

        if(picture1.getWidth()>mx-110 ||picture1.getHeight()>my-30 )
        {
            neww= (int) Math.round(picture1.getWidth() * 0.25); // reduce size
            newh = (int) Math.round(picture1.getHeight() *0.25);
        }
        else
        {
            neww=picture1.getWidth();
            newh=picture1.getHeight();
        }

        bi = new BufferedImage(neww,newh,BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = (Graphics2D) bi.createGraphics();
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY));
        g2d.drawImage(picture1,0,0,neww,newh,0,0,picture1.getWidth(),picture1.getHeight(), null);
        label3.setIcon(new ImageIcon(bi));
        label3.setBounds(150,150,neww,newh); //draw image
    }

    public static void main(String[] args) 
    {
        new Bright();
    }
}

createimage方法创建一个新的BufferedImage,并通过ImageIcon将此图像添加到UI。 结果,对pict​​ure1变量的更改将不会反映在UI中。 此外,如果确实进行了更改,则可能有必要在UI对象上调用重绘(您可能会更好,并且拥有更大的灵活性来创建自己的JPanel并使用自定义绘画来绘制图像)。 该代码段中还有很多其他值得一提的东西,但不一定与您的问题直接相关:

  1. 避免像瘟疫这样的空布局
  2. 您是否打算改变图像的亮度或不透明度(例如Alpha)。 如果计划更改图像的不透明度,则图像应具有alpha分量(createimage方法创建不带alpha的RGB类型)。
  3. 如果没有必要,您的类没有理由扩展JFrame
  4. 您两次调用createimage。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM