Java语言实现的将图片解码为RGB565的mif数据文件

Java语言实现的将图片解码为RGB565的mif数据文件

  1. 背景:
    杭电电子信息工程大二在读, 在本学期的数字系统课程设计课程中做FPGA的VGA显示实验, 老师要求做一个将图片解码为RGB565格式的mif数据的小软件, 用于存入FPGA的ROM供VGA显示, 正好这学期学了一点Java, 现学现卖, 发挥Java易于做图形界面的优点, 东拼西凑作出了这个功能和外观都很简陋的小软件, 也给自己挖个坑, 暑假好好学学Java再把这个东西完善一下.

  2. 代码:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.*; 
import javax.imageio.ImageIO;

public class Pic2Mif extends JFrame implements ActionListener{
	public static void main(String[] args) throws Exception{  
        new Pic2Mif();
    }

	String image_path;				//图片文件路径
	String mif_path;				//mif文件路径

	JButton open=null;	
	//构造方法
    public Pic2Mif(){  
        open=new JButton("打开一张图片");
        this.add(open);
        this.setBounds(400,200,100,100);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        open.addActionListener(this);
    }
	
    public void actionPerformed(ActionEvent e){  
        // TODO Auto-generated method stub  
        JFileChooser jfc=new JFileChooser();  
        jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES );  
        jfc.showDialog(new JLabel(), "选择");  
        File file=jfc.getSelectedFile();  
		if(file.isFile()){
			image_path=file.getAbsolutePath();
			//String.indexof()方法搜索在该字符串上是否出现了作为参数传递的字符串,若找到字符串,则返回字符串首字母的位置(0代表第一个位置)
			mif_path=image_path.substring(0,image_path.indexOf("."))+".mif";		//把图片的路径转化为mif的路径
            //System.out.println(image_path);
			//System.out.println(mif_path);
        }else{
			JOptionPane.showMessageDialog(null,"ERROR!NOT A FILE!");		//不是一个文件,报错
		}
		//调用getImagePixel函数进行转换
		try{
			getImagePixel(image_path,mif_path);
			JOptionPane.showMessageDialog(null,"转换成功!MIF文件与图片在同一目录");
		}catch(Exception ex){
			JOptionPane.showMessageDialog(null,"出错了!不是图片吧兄弟");
		}
    }
	//使用getRGB的API将图片解码成RGB565,并写入mif_p路径下的同名文件(使用了输出重定向)
	public static void getImagePixel(String image_p,String mif_p) throws Exception{
		//System.out.println(image_p);
		//System.out.println(mif_p);
		int[] rgb=new int[3];
		String rgb_565="";
		File f_image=new File(image_p);
		BufferedImage bi = null;
		try{
			bi=ImageIO.read(f_image);
		}catch(Exception e) {
			e.printStackTrace();
		}

		int width=bi.getWidth();
		int height=bi.getHeight();
		int depth=width*height;

		//一次性创建PrintStream输出流
		PrintStream ps=new PrintStream(new FileOutputStream(mif_p));
		//将标准输出重定向到PS输出流
        System.setOut(ps);
        //向标准输出输出字符串
		System.out.println("WIDTH=16;\nDEPTH="+depth+";\n\nADDRESS_RADIX=UNS;\nDATA_RADIX=HEX;\n\nCONTENT BEGIN");
		
		for (int i=0;i<height;i++){
			for (int j=0; j<width;j++){
				int pixel=bi.getRGB(j,i);
				rgb[0]=(pixel & 0xff0000)>>(16+3);
				rgb[1]=(pixel & 0x00ff00)>>(8+2);
				rgb[2]=(pixel & 0x0000ff)>>3;

				rgb_565=Integer.toHexString(bin_str2dec(dec2bin(rgb[0],5)+dec2bin(rgb[1],6)+dec2bin(rgb[2],5)));
				rgb_565=rgb_565.toUpperCase();
				System.out.println("    "+(i*90+j)+"     :  "+rgb_565+";");
				//write_file(i*90+j,rgb_565);
			}
		}
		System.out.println("END;");
	}

	//将一个数转化为指定宽度的二进制数
	 public static String dec2bin(int decNum , int digit) {
        String binStr = "";
        for(int i= digit-1;i>=0;i--) {
            binStr +=(decNum>>i)&1;
        }
        return binStr;
    }

	//将一串0和1的字符串转化为整数
	public static int bin_str2dec(String bin_str){
        int total=0;
        char[] binCharArray=bin_str.toCharArray();
        for (int i=0;i<binCharArray.length;i++){
            total=total+binCharArray[i]-48;
            if(i!=binCharArray.length-1){
                total=total<<1;
            }
        }
        return total;
    }
}

3.将源代码转化为exe文件:
先用eclipse将源代码打包成jar包, 再用exe4j将jar包转化为exe文件

你可能感兴趣的:(Java)