/**
* @ReadWriteRAW.java
* @Version 1.0, 2009.5.18
* @Author Xie-Hua Sun
* Read *.gif, *.jpg, *.jpeg, *.png, *.raw, *.dat
* Save as *.RAW images
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import java.io.*;
public class ReadWriteRAW extends Frame implements ActionListener
{
private MenuItem openItem;
private MenuItem saveItem;
private MenuItem exitItem;
Image image;
int[] pixels;
int width = 256, // (Baboo.raw 512*512, 256k)
height = 256;
boolean flag = false; //装载图像标志
//构造方法
public ReadWriteRAW()
{
setTitle("图像载入与存储 保存为RAW文件");
this.setBackground(Color.lightGray);
//关闭窗口
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
//菜单界面
Menu fileMenu = new Menu("文件");
openItem = new MenuItem("打开");
openItem.addActionListener(this);
fileMenu.add(openItem);
saveItem = new MenuItem("保存");
saveItem.addActionListener(this);
fileMenu.add(saveItem);
exitItem = new MenuItem("退出");
exitItem.addActionListener(this);
fileMenu.add(exitItem);
MenuBar menuBar = new MenuBar();
menuBar.add(fileMenu);
setMenuBar(menuBar);
setSize(266, 320);
setVisible(true);
}
//调用paint()方法,显示图像信息。
public void paint(Graphics g)
{
if(flag)
g.drawImage(image,5,50,this);
}
public void actionPerformed(ActionEvent e)
{
//打开JPG图像
if(e.getSource() == openItem)
{
MediaTracker mt = new MediaTracker(this);
//文件选择对话框
JFileChooser chooser = new JFileChooser();
int r = chooseFile(chooser, ".");
if(r == JFileChooser.APPROVE_OPTION)
{
String name = chooser.getSelectedFile().getAbsolutePath();
//取文件名长度
int len = name.length();
//取文件名的扩展名
String str = name.substring(len-3,len);
//若为RAW或DAT文件
if(str.equalsIgnoreCase("raw")||str.equalsIgnoreCase("dat"))
{
JOptionPane.showMessageDialog(null,"若RAW图像大小不是64k,"+
"需修改width,height!", "Alert",
JOptionPane.INFORMATION_MESSAGE);
readRAW(name, width, height);
}
else
{
image = openImage(name);
}
flag = true;
repaint();
}
}
//将image编码为RAW图像
else if(e.getSource() == saveItem)
{
pixels = new int[width * height];
try
{
PixelGrabber pg = new PixelGrabber(image, 0, 0, width, height,
pixels,0, width);
pg.grabPixels();
}
catch (InterruptedException e3) { e3.printStackTrace(); }
writeRAW("../image/test.raw", pixels, width, height);
JOptionPane.showMessageDialog(null,"在目录image,保存图像test.raw成功!",
"Alert",JOptionPane.INFORMATION_MESSAGE);
}
}
//读入.raw文件
public void readRAW(String name, int iw, int ih)
{
int[] pixels = new int[iw*ih];
try
{
FileInputStream fin = new FileInputStream(name);
DataInputStream in = new DataInputStream(fin);
for(int i = 0; i < iw*ih; i++){ //磁盘文件读入数据
int c = in.readByte();
if(c < 0) c = c + 256;
pixels[i] = (255<<24)|(c<<16)|(c<<8)|c;
}
}
catch(IOException e1){System.out.println("Exception!");}
//将数组中的象素产生一个图像
ImageProducer ip = new MemoryImageSource(iw, ih, pixels, 0, iw);
image = createImage(ip);
}
//在当前目录写入.raw文件
public void writeRAW(String name, int[] pix, int iw, int ih)
{
try
{
RandomAccessFile rf = new RandomAccessFile(name,"rw");
for(int i = 0; i < iw*ih; i++)
rf.writeByte((byte)(pix[i]&0xff));
rf.close();
}
catch(FileNotFoundException e1){
System.err.println(e1);
}
catch(IOException e2){
System.err.println(e2);
}
}
public int chooseFile(JFileChooser jfc, String str)
{
//设置默认文件目录
jfc.setCurrentDirectory(new File(str));
//设置参数gif,jpg,jpeg,png为本程序可显示图像
jfc.setFileFilter(new javax.swing.filechooser.FileFilter()
{
public boolean accept(File f)
{
String name = f.getName().toLowerCase();
return name.endsWith(".gif")
|| name.endsWith(".jpg")
|| name.endsWith(".jpeg")
|| name.endsWith(".png")
|| name.endsWith(".raw")
|| name.endsWith(".dat")
|| f.isDirectory();
}
public String getDescription()
{
return "Image files(*.gif, *.jpg, *.jpeg, *.png, *.raw, *.dat)";
}
});
return (jfc.showOpenDialog(this));
}
//打开图像
public Image openImage(String is)
{
//用MediaTracker跟踪图像加载
MediaTracker tracker = new MediaTracker(this);
Image im = Toolkit.getDefaultToolkit().getImage(is);
tracker.addImage(im,0);
//等待图像完成加载
try { tracker.waitForID(0); }
catch(InterruptedException e){ }
return im;
}
public static void main(String[] args)
{
new ReadWriteRAW();
}
}