import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import java.lang.*;
public class LineGrey extends Frame {
    Image im, tmp, tmp2;    int i, iw, ih;    int[] pixels;    boolean flag = false, flag2 = false;    double a, b;    TextField texta, textb;    // 构造方法
    public LineGrey() {
        super("线性灰度变换");
        Panel pdown;
        JButton load, run, save, quit;
        // parse.Double        // 添加窗口监听事件
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });        pdown = new Panel();
        pdown.setBackground(Color.lightGray);        load = new JButton("打开图像");
        run = new JButton("灰度变换");
        quit = new JButton("退出");
        texta = new TextField("请输入a值", 6);
        textb = new TextField("请输入b值", 6);
        save = new JButton("保存");
        // String str = text.getText();
        // a = Double.parseDouble(str);        this.add(pdown, BorderLayout.SOUTH);        pdown.add(load);
        pdown.add(run);        pdown.add(texta);
        pdown.add(textb);
        pdown.add(save);
        pdown.add(quit);        load.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jLoad_ActionPerformed(e);
            }
        });        run.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jRun_ActionPerformed(e);
            }
        });        quit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jQuit_ActionPerformed(e);
            }
        });        save.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jSave_ActionPerformed(e);
            }
        });
    }    public void jLoad_ActionPerformed(ActionEvent e) {
        // 利用MediaTracker跟踪图像的加载
        MediaTracker tracker = new MediaTracker(this);
        // im = Toolkit.getDefaultToolkit().getImage("Miss.jpg");        JFileChooser chooser = new JFileChooser();        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "JPG & GIF Images", "jpg", "gif");
        chooser.setFileFilter(filter);
        if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {            ImageIcon icon = new ImageIcon(chooser.getSelectedFile()
                    .getAbsolutePath());
            im = icon.getImage();        }        tracker.addImage(im, 0);        // 等待图像的完全加载
        try {
            tracker.waitForID(0);
        } catch (InterruptedException e2) {
            e2.printStackTrace();
        }        // 获取图像的宽度iw和高度ih
        iw = im.getWidth(this);
        ih = im.getHeight(this);        pixels = new int[iw * ih];        try {
            PixelGrabber pg = new PixelGrabber(im, 0, 0, iw, ih, pixels, 0, iw);
            pg.grabPixels();
        } catch (InterruptedException e3) {
            e3.printStackTrace();
        }        // 获得图像的RGB值和Alpha值
        ColorModel cm = ColorModel.getRGBdefault();
        for (i = 0; i < iw * ih; i++) {
            int alpha = cm.getAlpha(pixels[i]);
            int red = cm.getRed(pixels[i]);
            int green = cm.getGreen(pixels[i]);
            int blue = cm.getBlue(pixels[i]);
            pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;
        }        // 将数组中的象素产生一个图像
        ImageProducer ip = new MemoryImageSource(iw, ih, pixels, 0, iw);
        tmp = createImage(ip);
        
    
        flag = true;
        flag2 = false;        // Graphics g =new Graphics();
        // g.drawImage(tmp, 10, 20, this);
        repaint();
    }    public void jRun_ActionPerformed(ActionEvent e) {
        if (flag) {            String str1 = texta.getText();
            a = Double.parseDouble(str1);
            String str2 = textb.getText();
            b = Double.parseDouble(str2);            try {
                PixelGrabber pg = new PixelGrabber(im, 0, 0, iw, ih, pixels, 0,
                        iw);
                pg.grabPixels();
            } catch (InterruptedException e3) {
                e3.printStackTrace();
            }            // 对图像进行进行线性拉伸,Alpha值保持不变
            ColorModel cm = ColorModel.getRGBdefault();
            for (i = 0; i < iw * ih; i++) {
                int alpha = cm.getAlpha(pixels[i]);
                int red = cm.getRed(pixels[i]);
                int green = cm.getGreen(pixels[i]);
                int blue = cm.getBlue(pixels[i]);                // 增加了图像的亮度                red = (int) (a * red + b);
                green = (int) (a * green + b);
                blue = (int) (a * blue + b);
                if (red >= 255) {
                    red = 255;
                }
                if (green >= 255) {
                    green = 255;
                }
                if (blue >= 255) {
                    blue = 255;
                }
                pixels[i] = alpha << 24 | red << 16 | green << 8 | blue;
            }            // 将数组中的象素产生一个图像
            ImageProducer ip = new MemoryImageSource(iw, ih, pixels, 0, iw);
            tmp2 = createImage(ip);
            flag2 = true;            repaint();
        } else {
            JOptionPane.showMessageDialog(null, "请先打开一幅图片!", "提示",
                    JOptionPane.WARNING_MESSAGE);
        }
    }   public void jSave_ActionPerformed(ActionEvent e) {
        JFileChooser chooser = new JFileChooser();
        if (chooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
                                ......
        //这里接下来再怎么操作,才能将处理后的图片保存下来啊?? 
//处理后的图像数据保存在pixels[]  数组里面         }
            }    public void jQuit_ActionPerformed(ActionEvent e) {
        // System.exit(0);
        JOptionPane op = new JOptionPane();
        int exit = op.showConfirmDialog(this, "你要退出吗? ? ?", "退出",
                JOptionPane.YES_NO_OPTION);        if (exit == JOptionPane.YES_OPTION) {
            System.exit(0);        } else {
        }
    }    // 调用paint()方法,显示图像信息。
    public void paint(Graphics g) {
        if (flag) {
            g.drawImage(tmp, 10, 20, this);            if (flag2) {
                g.drawImage(tmp2, 30 + iw, 20, this);            }
        }        else {
        }
    }    // 定义main方法,设置窗口的大小,显示窗口
    public static void main(String[] args) {
        LineGrey lg = new LineGrey();
        lg.setLocation(50, 50);
        lg.setSize(600, 400);
        lg.show();
    }
}