package me.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.image.BufferedImage; import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; import java.util.Random; import nl.captcha.text.renderer.WordRenderer; public class MyWordRenderer implements WordRenderer { private static final Random RAND = new SecureRandom(); private static final List<Color> DEFAULT_COLORS = new ArrayList<Color>(); private static final List<Font> DEFAULT_FONTS = new ArrayList<Font>(); // The text will be rendered 25%/5% of the image height/width from the X and Y axes private static final double YOFFSET = 0.25; private static final double XOFFSET = 0.05; // px private int spacing = 5; static { DEFAULT_COLORS.add(Color.BLACK); DEFAULT_FONTS.add(new Font("Arial", Font.BOLD, 40)); DEFAULT_FONTS.add(new Font("Courier", Font.BOLD, 40)); } private final List<Color> _colors = new ArrayList<Color>(); private final List<Font> _fonts = new ArrayList<Font>(); /** * Use the default color (black) and fonts (Arial and Courier). */ public MyWordRenderer() { this(DEFAULT_COLORS, DEFAULT_FONTS); } public MyWordRenderer(List<Color> colors, List<Font> fonts) { _colors.addAll(colors); _fonts.addAll(fonts); } @Override public void render(String word, BufferedImage image) { Graphics2D g = image.createGraphics(); RenderingHints hints = new RenderingHints( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); hints.add(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); g.setRenderingHints(hints); FontRenderContext frc = g.getFontRenderContext(); int xBaseline = (int) Math.round(image.getWidth() * XOFFSET); int yBaseline = image.getHeight() - (int) Math.round(image.getHeight() * YOFFSET); char[] chars = new char[1]; for (char c : word.toCharArray()) { chars[0] = c; g.setColor(_colors.get(RAND.nextInt(_colors.size()))); int choiceFont = RAND.nextInt(_fonts.size()); Font font = _fonts.get(choiceFont); g.setFont(font); GlyphVector gv = font.createGlyphVector(frc, chars); g.drawChars(chars, 0, chars.length, xBaseline, yBaseline); int width = (int) gv.getVisualBounds().getWidth(); xBaseline = xBaseline + width + spacing; } } public int getSpacing() { return spacing; } public void setSpacing(int spacing) { this.spacing = spacing; } }