package demo; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; /** * <p>Gif验证码类</p> * * @author: wuhongjun * @version:1.0 */ public class GifCaptcha extends Captcha { public GifCaptcha() { } public GifCaptcha(int width,int height){ this.width = width; this.height = height; } public GifCaptcha(int width,int height,int len){ this(width,height); this.len = len; } public GifCaptcha(int width,int height,int len,Font font) { this(width,height,len); this.font = font; } @Override public void out(OutputStream os) { try { GifEncoder gifEncoder = new GifEncoder(); // gif编码类,这个利用了洋人写的编码类,所有类都在附件中 //生成字符 gifEncoder.start(os); gifEncoder.setQuality(180); gifEncoder.setDelay(100); gifEncoder.setRepeat(0); BufferedImage frame; char[] rands =alphas(); Color fontcolor[]=new Color[len]; for(int i=0;i<len;i++) { fontcolor[i]=new Color(20 + num(110), 20 + num(110), 20 + num(110)); } for(int i=0;i<len;i++) { frame=graphicsImage(fontcolor, rands, i); gifEncoder.addFrame(frame); frame.flush(); } gifEncoder.finish(); }finally { try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 画随机码图 * @param fontcolor 随机字体颜色 * @param strs 字符数组 * @param flag 透明度使用 * @return BufferedImage */ private BufferedImage graphicsImage(Color[] fontcolor,char[] strs,int flag) { BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); //或得图形上下文 //Graphics2D g2d=image.createGraphics(); Graphics2D g2d = (Graphics2D)image.getGraphics(); //利用指定颜色填充背景 g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, width, height); AlphaComposite ac3; int h = height - ((height - font.getSize()) >>1) ; int w = width/len; g2d.setFont(font); for(int i=0;i<len;i++) { ac3 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getAlpha(flag, i)); g2d.setComposite(ac3); g2d.setColor(fontcolor[i]); g2d.drawOval(num(width), num(height), 5+num(10), 5+num(10)); g2d.drawString(strs[i]+"", (width-(len-i)*w)+(w-font.getSize())+1, h-4); } g2d.dispose(); return image; } /** * 获取透明度,从0到1,自动计算步长 * @return float 透明度 */ private float getAlpha(int i,int j) { int num = i+j; float r = (float)1/len,s = (len+1) * r; return num > len ? (num *r - s) : num * r; } }

代码男神2019 LV10
2021年11月21日
17665202833 LV2
2021年7月1日
天险无涯 LV15
2021年2月2日
846173996 LV2
2021年1月26日
数据库1 LV12
2020年7月11日
gan857569302 LV9
2020年6月28日
104227972 LV1
2020年4月24日
rainsheep LV5
2020年4月1日
Alex_zpy LV13
2020年3月4日
zengtianzhi LV2
2019年12月14日

3334004690 LV10
2024年6月8日
EFWAGGFAWGR
2023年10月19日
暂无贡献等级
zxh2023 LV1
2023年6月30日
12522425 LV13
2023年4月15日
dxn111
2022年11月28日
暂无贡献等级
张好好 LV1
2022年10月26日
tianli3000 LV8
2022年4月28日
JohnAlex LV9
2022年1月29日
17798830 LV14
2022年1月25日
代码男神2019 LV10
2021年11月21日