我编了个程序,功能是在JLabel上通过按钮打开来显示图片,现在想把JLabel上的图片保存下来,不知道怎么搞,下面是代码,希望有高手帮下忙:关键是下面的public void save(File file)方法那里:
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.imageio.ImageIO;//import com.sun.image.codec.jpeg.JPEGCodec; 
//import com.sun.image.codec.jpeg.JPEGImageEncoder;public class OpenImage extends JFrame implements ActionListener{
private JMenuItem jmiOpen = new JMenuItem("打开(O)");
private JMenuItem jmiSave = new JMenuItem("另存为(S)");
private JMenuItem jmiExit = new JMenuItem("退出(E)");
private JMenuItem jmiInfo = new JMenuItem("说明(I)");
private JMenuItem jmiAbout = new JMenuItem("关于(A)");

private JButton jbtUp = new JButton("上一张");
private JButton jbtDown = new JButton("下一张");
private JFileChooser jfc = new JFileChooser(new File("."));
private JLabel jl = new JLabel();
private JLabel status = new JLabel();

 
public OpenImage(){
JMenu jm1 = new JMenu("文件(F)");
jm1.add(jmiOpen);
jm1.add(jmiSave);
jm1.addSeparator();
jm1.add(jmiExit);
JMenu jm2 = new JMenu("帮助(H)");
jm2.add(jmiInfo);
jm2.add(jmiAbout);
JMenuBar jmBar = new JMenuBar();
jmBar.add(jm1);
jmBar.add(jm2);
setJMenuBar(jmBar);

JPanel jp = new JPanel();
jp.add(jbtUp);
jp.add(jbtDown);
jp.add(status,BorderLayout.SOUTH); getContentPane().add(new JScrollPane(jl),BorderLayout.CENTER);
   jl.setOpaque(true);     //  JLabel默认是透明的,所以直接setBackground()不能设置其背景颜色,但setForceground不用
   jl.setBackground(Color.white);
   jl.setHorizontalAlignment(0);//将jl设置放在中央,不加这句,图片/文字将显示水平靠左,垂直为中间的位置,
                                         //我也百思不得其解.括号里的数是从0-1的int,alignment的定义
getContentPane().add(jp,BorderLayout.SOUTH);

jmiOpen.addActionListener(this);//按钮事件
jmiSave.addActionListener(this);
jmiExit.addActionListener(this);
jmiInfo.addActionListener(this);
jmiAbout.addActionListener(this);
jbtUp.addActionListener(this);
jbtDown.addActionListener(this);

}
public void actionPerformed(ActionEvent e){
if(e.getSource() == jmiOpen)
open();
else if(e.getSource() == jmiSave)
save();
else if(e.getSource() == jmiExit)
System.exit(0);
else if(e.getSource() == jbtUp)
up();
    else if(e.getSource() == jbtDown)
     down();
else if(e.getSource() == jmiInfo){
JOptionPane.showMessageDialog(null,"此程序只能打开下列格式的图像:\n.jpg.bmp.png.gif",
 "说明",JOptionPane.INFORMATION_MESSAGE);
}
else if(e.getSource() == jmiAbout){
JOptionPane.showMessageDialog(null,"此程序由牛牛编写.\n2008-10-31",
"关于",JOptionPane.INFORMATION_MESSAGE);
}

}

public void open(){
if(jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
open(jfc.getSelectedFile());
}
public void open(File file){
     try{
       BufferedImage bi = ImageIO.read(file); //Java默认支持的图片类型为jpg,bmp,gif,png
       ImageIcon icon = new ImageIcon(bi);
       jl.setIcon(icon);                 // void setIcon(Icon icon) 定义此组件将要显示的图标,API里的JLabel   
      
       long length = file.length();    //图像文件的大小,在file里定义了此方法
       int width = bi.getWidth();     //图像的高度
       int height = bi.getHeight();  //图像的宽度,在JDK API里的BufferedImage有定义,或用ImageIcon里的方法:
                                    // icon.getIconWidth()和icon.getIconHeight().  
       status.setText("  " + file.getName() + " 被打开;" + 
                      "  大小: " + length + " bytes;" +
                      "  分辨率: " + width + " × " + height);
     }
     catch(IOException ex){
      JOptionPane.showMessageDialog(null,"The image is not supported!",
                             "Error",JOptionPane.INFORMATION_MESSAGE);
     }
}

public void save(){
if(jfc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
save(jfc.getSelectedFile());
}
public void save(File file){
     try{  
         BufferedImage out = ImageIO.read(file);
         
         Icon ic = jl.getIcon();
         File output = new File("C:\\1.jpg");              
           ImageIO.write(out,"jpg" ,output);
         } 
         catch(IOException ex){
         }     
}

public void up(){

}
public void down(){ }

public static void main(String[] args){
OpenImage openImage = new OpenImage();
openImage.setTitle("图像浏览器");
openImage.setVisible(true);
openImage.setSize(800,700);
openImage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}
}在public void save(File file)方法那里我把JLabel的图片获取成icon对象,但是接下来就不知道怎么搞,怎样把icon对象变成BufferedImage对象,怎样对象保存对话框把JLabel里的图片就按原格式保存到任意位置啊?谢谢!!

解决方案 »

  1.   

        public static Image getImageFromIcon(Icon icon) {
            if (icon == null) {
                return null;
            }        if (icon instanceof ImageIcon) {
                return ((ImageIcon) icon).getImage();
            }        int width = icon.getIconWidth();
            int height = icon.getIconHeight();
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            Graphics g = image.getGraphics();
            icon.paintIcon(null, g, 0, 0);        return image;
        }
      

  2.   

    非常谢谢!从你的程序得到了灵感,我把public void save()方法改为下面的,保存到任意路径OK!:
    public void save(File file){
         try{     
             Icon icon = jl.getIcon(); //从jl中得到图片
             int width = icon.getIconWidth(); 
               int height = icon.getIconHeight(); 
               BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//把TYPE_INT_RGB改成TYPE_INT_ARGB图像会变得模糊
               Graphics g = image.getGraphics();
               icon.paintIcon(null, g, 0, 0); 
               
               File output = new File(file.getPath());              
               ImageIO.write(image,"jpg" ,output);//把image写入output中
             } 
             catch(IOException ex){
             }
    还有个小问题就是TYPE_INT_ARGB保存后图像是模糊的,我设置为TYPE_INT_RGB,现在一切问题搞定!很感谢!!