怎么可以让图片验证码里面每一张的每个字母的字体和颜色随机啊

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

import java.awt.geom.AffineTransform;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.Arrays;

import java.util.Random;

import javax.imageio.ImageIO;

public class Picture{

//系统字符源

public static final String VA_CODES="acdefghjkmnprstuwx3457ACEFGHJKLMNQRSTUVWX";
private static Random random = new Random();  

public static String generateVerifyCode(int verifySize){

return generateVerifyCode(verifySize, VA_CODES);

}

//自定义的字符源
public static String generateVerifyCode(int verifySize, String sources){

if(sources == null || sources.length() == 0){

sources = VA_CODES;

} //无自定义字符源
int codesLen = sources.length();

Random rand = new Random(System.currentTimeMillis());

StringBuilder verifyCode = new StringBuilder(verifySize);

for(int i = 0; i < verifySize; i++){

verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));

}

return verifyCode.toString();

}

public static String outputVerifyImage(int wi, int he, File outputFile, int verifySize) throws IOException{  
    String verifyCode = generateVerifyCode(verifySize);  
    outputImage(wi, he, outputFile, verifyCode);  
    return verifyCode;  
}  


public static String outputVerifyImage(int wi, int he, OutputStream os, int verifySize) throws IOException{  
    String verifyCode = generateVerifyCode(verifySize);  
    outputImage(wi, he, os, verifyCode);  
    return verifyCode;  
}  


public static void outputImage(int wi, int he, File outputFile, String code) throws IOException{  
    if(outputFile == null){  
        return;  
    }  
    File dir = outputFile.getParentFile();  
    if(!dir.exists()){  
        dir.mkdirs();  
    }  
    try{  
        outputFile.createNewFile();  
        FileOutputStream fos = new FileOutputStream(outputFile);  
        outputImage(wi, he, fos, code);  
        fos.close();  
    } catch(IOException e){  
        throw e;  
    }  
}  


public static void outputImage(int wi, int he, OutputStream os, String code) throws IOException{  
    int verifySize = code.length();  
    BufferedImage image = new BufferedImage(wi, he, BufferedImage.TYPE_INT_RGB);  
    Random rand = new Random();  
    Graphics2D g2 = image.createGraphics();  

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);  
    Color[] colors = new Color[5];  
    Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN,  
            Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,  
            Color.PINK, Color.YELLOW };  
    float[] fractions = new float[colors.length];  
    for(int i = 0; i < colors.length; i++){  
        colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];  
        fractions[i] = rand.nextFloat();  
    }  

    Arrays.sort(fractions);  

    g2.setColor(Color.GRAY);// 
    g2.fillRect(0, 0, wi, he);  

    Color c = getRandColor(200, 250); 
    Font f =getRandomFont();




    char[] charts = code.toCharArray(); 
    for(int i=0;i<charts.length;i++){

        g2.setColor(c);// 
        g2.setFont(f);
        g2.fillRect(0, 2, wi, he-4);
    }

    //干扰线  
    Random random = new Random();  
    g2.setColor(getRandColor(160, 200)); 
    for (int i = 0; i < 20; i++) {  
        int x = random.nextInt(wi - 1);  
        int y = random.nextInt(he - 1);  
        int xl = random.nextInt(6) + 1;  
        int yl = random.nextInt(12) + 1;  
        g2.drawLine(x, y, x + xl + 40, y + yl + 20);  
    }  

    // 噪点  
    float yawpRate = 0.05f;// 噪声率  
    int area = (int) (yawpRate * wi * he);  
    for (int i = 0; i < area; i++) {  
        int x = random.nextInt(wi);  
        int y = random.nextInt(he);  
        int rgb = getRandomIntColor();  
        image.setRGB(x, y, rgb);  
    }  

shear(g2, wi, he, c, f);// 扭曲图片

    g2.setColor(getRandColor(100, 160));  
    int fontSize = he-4;  
    Font font = getRandomFont();
    g2.setFont(font);  
    char[] chars = code.toCharArray();  
    for(int i = 0; i < verifySize; i++){  
        AffineTransform affine = new AffineTransform();  
        affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), (wi / verifySize) * i + fontSize/2, he/2);  
        g2.setTransform(affine);  
        g2.drawChars(chars, i, 1, ((wi-10) / verifySize) * i + 5, he/2 + fontSize/2 - 10);  
    }  

    g2.dispose();  
    ImageIO.write(image, "jpg", os);  
}  

private static Color getRandColor(int fc, int bc) {  
    if (fc > 255)  
        fc = 255;  
    if (bc > 255)  
        bc = 255;  
    int r = fc + random.nextInt(bc - fc);  
    int g = fc + random.nextInt(bc - fc);  
    int b = fc + random.nextInt(bc - fc);  
    return new Color(r, g, b);  
}  

private static int getRandomIntColor() {  
    int[] rgb = getRandomRgb();  
    int color = 0;  
    for (int c : rgb) {  
        color = color << 8;  
        color = color | c;  
    }  
    return color;  
}  

private static int[] getRandomRgb() {  
    int[] rgb = new int[3];  
    for (int i = 0; i < 3; i++) {  
        rgb[i] = random.nextInt(255);  
    }  
    return rgb;  
}  

private static Font getRandomFont() { 
    String[] fonts = {"Gill sans", "Agency FB", "Consolas", "Comic Sans MS", "Time News Roman", "Courier New", "Arial Black", "Quantzite"}; 
    int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1)); 
    int fontSize = (int) Math.round(Math.random() * 4 + 16); 
    return new Font(fonts[fontIndex], Font.PLAIN, fontSize); 
} 

private static void shear(Graphics g, int w1, int h1, Color color,Font font) {  
    shearX(g, w1, h1, color,font);  
    shearY(g, w1, h1, color,font);  
}  

private static void shearX(Graphics g, int w1, int h1, Color color,Font font) {  

    int period = random.nextInt(2);  

    boolean borderGap = true;  
    int frames = 1;     
    int phase = random.nextInt(2);  

    for (int i = 0; i < h1; i++) {  
        double d = (double) (period >> 1)  
                * Math.sin((double) i / (double) period  
                        + (6.2831853071795862D * (double) phase)  
                        / (double) frames);  
        g.copyArea(0, i, w1, 1, (int) d, 0);  
        if (borderGap) {  
            g.setFont(font);
            g.setColor(color);  
            g.drawLine((int) d, i, 0, i);  
            g.drawLine((int) d + w1, i, w1, i);  
        }  
    }  

}  

private static void shearY(Graphics g, int w1, int h1, Color color,Font font) {  

    int period = random.nextInt(40) + 10; // 50;  

    boolean borderGap = true;  
    int frames = 20;  
    int phase = 7;  
    for (int i = 0; i < w1; i++) {  
        double d = (double) (period >> 1)  
                * Math.sin((double) i / (double) period  
                        + (6.2831853071795862D * (double) phase)  
                        / (double) frames);  
        g.copyArea(i, 0, 1, h1, 0, (int) d);  
        if (borderGap) { 
            g.setFont(font);
            g.setColor(color);  
            g.drawLine(i, (int) d, i, 0);  
            g.drawLine(i, (int) d + h1, i, h1);  
        }  

    }  

}  
public static void main(String[] args) throws IOException{  
    File diy = new File("E:/521");  
    int w = 200, h = 80;  
    for(int i = 0; i < 50; i++){  
        String verifyCode = generateVerifyCode(4);  
        File file = new File(diy, verifyCode + ".jpg");  
        outputImage(w, h, file, verifyCode);  
    }  
}  

}

这是我现在的。。求大神帮看看

字母就不多说了,写一个随机数就可以取得,,随机颜色,就是使用rgb(),里面的就是数字,然后生成三个0-255之间的随机数,作为参数,就能得到随机的颜色

现在的问题是每一张验证码之间颜色字体不一样,但是同一张验证码的字母之间是一样的

0.0萌新表示学习到了东西!