/**
* <p>Title: 校验码图片</p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) Karl Luo</p>
*
* <p>Company: SFStudio</p>
*
* @author Karl Luo
* @version 1.0
*/
import java.io.*;
import java.awt.image.*;
import java.util.Hashtable;
import com.sun.image.codec.jpeg.*;
public class ValidationImage {
private String validationCode = ""; //校验码
private int validationCodeLength = 6; //校验码长度
private int imWidth = 114; //图片宽度
private int imHeight = 27; //图片高度
private String imType = "JPEG"; //图片类型
private String imFileName = ""; //生成图片文件名称
private BufferedImage bufImg = null;
private int wMatrix = 5; //数组宽度
private int hMatrix = 7; //数组高度
private int[][] char_1 = {{0,0,1,0,0},{0,1,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,1,1,1,0}};
private int[][] char_2 = {{0,1,1,1,0},{1,0,0,0,1},{0,0,0,0,1},{0,0,1,1,0},{0,1,0,0,0},{1,0,0,0,0},{1,1,1,1,1}};
private int[][] char_3 = {{0,1,1,1,0},{1,0,0,0,1},{0,0,0,0,1},{0,1,1,1,0},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_4 = {{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,1},{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1}};
private int[][] char_5 = {{1,1,1,1,1},{1,0,0,0,0},{1,0,0,0,0},{1,1,1,1,0},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_6 = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,0},{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_7 = {{1,1,1,1,1},{1,0,0,0,1},{0,0,0,0,1},{0,0,0,1,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0}};
private int[][] char_8 = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_9 = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,1},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_0 = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,1,1},{1,0,1,0,1},{1,1,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_A = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,1},{1,0,0,0,1},{1,0,0,0,1}};
private int[][] char_B = {{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,0}};
private int[][] char_C = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_D = {{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,0}};
private int[][] char_E = {{1,1,1,1,1},{1,0,0,0,0},{1,0,0,0,0},{1,1,1,1,0},{1,0,0,0,0},{1,0,0,0,0},{1,1,1,1,1}};
private int[][] char_F = {{1,1,1,1,1},{1,0,0,0,0},{1,0,0,0,0},{1,1,1,1,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0}};
private int[][] char_G = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,0},{1,0,1,1,1},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_H = {{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1}};
private int[][] char_I = {{1,1,1,1,1},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{1,1,1,1,1}};
private int[][] char_J = {{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_K = {{1,0,0,0,1},{1,0,0,1,0},{1,0,1,0,0},{1,1,0,0,0},{1,0,1,0,0},{1,0,0,1,0},{1,0,0,0,1}};
private int[][] char_L = {{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{1,1,1,1,1}};
private int[][] char_M = {{1,0,0,0,1},{1,1,0,1,1},{1,0,1,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1}};
private int[][] char_N = {{1,0,0,0,1},{1,1,0,0,1},{1,0,1,0,1},{1,0,0,1,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1}};
private int[][] char_O = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_P = {{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,0},{1,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0}};
private int[][] char_Q = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,1,1},{0,1,1,1,1}};
private int[][] char_R = {{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1}};
private int[][] char_S = {{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,0},{0,1,1,1,0},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_T = {{1,1,1,1,1},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0}};
private int[][] char_U = {{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}};
private int[][] char_V = {{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{0,1,0,1,0},{0,1,0,1,0},{0,0,1,0,0},{0,0,1,0,0}};
private int[][] char_W = {{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{1,0,1,0,1},{1,0,1,0,1},{0,1,0,1,0}};
private int[][] char_X = {{1,0,0,0,1},{1,0,0,0,1},{0,1,0,1,0},{0,0,1,0,0},{0,1,0,1,0},{1,0,0,0,1},{1,0,0,0,1}};
private int[][] char_Y = {{1,0,0,0,1},{1,0,0,0,1},{0,1,0,1,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0}};
private int[][] char_Z = {{1,1,1,1,1},{0,0,0,0,1},{0,0,0,1,0},{0,0,1,0,0},{0,1,0,0,0},{1,0,0,0,0},{1,1,1,1,1}};
private Hashtable charMatrixTable = null;
/**
* 初始化字符数组,保存到哈西表中!
*/
private void InitCharMatrix(){
charMatrixTable = new Hashtable();
charMatrixTable.put("1", char_1);
charMatrixTable.put("2", char_2);
charMatrixTable.put("3", char_3);
charMatrixTable.put("4", char_4);
charMatrixTable.put("5", char_5);
charMatrixTable.put("6", char_6);
charMatrixTable.put("7", char_7);
charMatrixTable.put("8", char_8);
charMatrixTable.put("9", char_9);
charMatrixTable.put("0", char_0);
charMatrixTable.put("A", char_A);
charMatrixTable.put("B", char_B);
charMatrixTable.put("C", char_C);
charMatrixTable.put("D", char_D);
charMatrixTable.put("E", char_E);
charMatrixTable.put("F", char_F);
charMatrixTable.put("G", char_G);
charMatrixTable.put("H", char_H);
charMatrixTable.put("I", char_I);
charMatrixTable.put("J", char_J);
charMatrixTable.put("K", char_K);
charMatrixTable.put("L", char_L);
charMatrixTable.put("M", char_M);
charMatrixTable.put("N", char_N);
charMatrixTable.put("O", char_O);
charMatrixTable.put("P", char_P);
charMatrixTable.put("Q", char_Q);
charMatrixTable.put("R", char_R);
charMatrixTable.put("S", char_S);
charMatrixTable.put("T", char_T);
charMatrixTable.put("U", char_U);
charMatrixTable.put("V", char_V);
charMatrixTable.put("W", char_W);
charMatrixTable.put("X", char_X);
charMatrixTable.put("Y", char_Y);
charMatrixTable.put("Z", char_Z);
}
/**
* 构造函数
*/
public ValidationImage(String imFileName) {
this.validationCode = this.GetNewValidationCode();
this.imFileName = imFileName;
this.Init();
}
/**
* 构造函数
* @param validationCode String
*/
public ValidationImage(String validationCode,String imFileName){
this.validationCode = validationCode;
this.imFileName = imFileName;
this.Init();
}
/**
* 初始化
*/
private void Init(){
try{
this.InitCharMatrix();
this.getNewImage();
this.DrawValidationCode();
this.OutputImage(this.imFileName);
}catch(Exception e){
System.out.println("ERROR");
}
}
/**
* 生成校验码,不实现,由PHP程序实现
* @return String
*/
private String GetNewValidationCode(){
return "JDK142";
}
/**
* 创建Image
* @return boolean
*/
private void getNewImage(){
this.bufImg = new BufferedImage(this.imWidth,this.imHeight,BufferedImage.TYPE_3BYTE_BGR);
}
/**
* 根据字符得到点阵图
* @return int[][]
*/
private int[][] getCharMatrix(char c){
int[][] cm = (int[][])this.charMatrixTable.get(String.valueOf(c));
return cm;
}
/**
* 画校验码到图片
*
*/
private void DrawValidationCode(){
if((this.validationCode == "")||(this.bufImg == null)){
return;
}
int[] rgbArray = {-1,-1,-1};
for(int i=0;i<this.validationCodeLength;i++){
char c = this.validationCode.charAt(i);
int[][] cm = this.getCharMatrix(c);
if(cm != null){
for(int j=0;j<this.hMatrix;j++){
for(int k=0;k<this.wMatrix;k++){
int xImg = (i+1)*3+k*3+i*5*3;
int yImg = (j+1)*3;
if(cm[j][k] == 1){
bufImg.setRGB(xImg,yImg,2,2, rgbArray,0,0);
}
}
}
}
}
}
/**
* 输出Image文件
* @param fileName String
* @param fileType String
* @return boolean
* @throws IOException
*/
private void OutputImage(String fileName) throws IOException{
if(this.bufImg != null){
FileOutputStream outputstream = new FileOutputStream(fileName);
JPEGEncodeParam jepgPara = JPEGCodec.getDefaultJPEGEncodeParam(this.bufImg);
jepgPara.setQuality(0.75F,true);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputstream);
encoder.encode(this.bufImg, jepgPara);
}
}
public static void main(String[] args) {
String validCode = args[0];
String imFileName = args[1];
if((validCode != null)&&(imFileName != null)){
ValidationImage image = new ValidationImage(validCode,imFileName);
}
}
}