MoparClassic/GameServer/src/org/moparscape/msc/gs/tools/PaintCaptcha.java

141 lines
3.9 KiB
Java

package org.moparscape.msc.gs.tools;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.ImageIcon;
public class PaintCaptcha {
private final static boolean GRAPH = true;
private final static Color GRAPH_COLOR = Color.GRAY;
private final static int LINES = 10;
/**
* @author xEnt
* @info Paints over an Image(Captcha) to make it more secure, with Lines,
* Squares and a Graph.
*/
private final static int SQUARES_MAX = 25;
private final static int SQUARES_MIN = 10;
/*
* public static void main(String [] args) throws Exception { Image img =
* Toolkit.getDefaultToolkit().getImage("C:\\heh.png");
* ImageIO.write(Img.toBufferedImage(secure(img)), "png", new
* File("C:\\roflrofl.png")); }
*/
public static long randomNumber(int min, int max) {
return Math.round((Math.random() * (max - min)) + min);
}
public static BufferedImage secure(BufferedImage b) {
try {
// BufferedImage b = toBufferedImage(img);
Graphics2D gfx = b.createGraphics();
gfx.setPaintMode();
// Draw the Squares.
Random random = new Random();
for (int i = 0; i < (int) randomNumber(SQUARES_MIN, SQUARES_MAX); i++) {
Color randomColor = Color.getHSBColor(random.nextFloat(), 1.0F,
1.0F);
gfx.setColor(randomColor);
gfx.drawRect((int) randomNumber(0, b.getWidth() - 80),
(int) randomNumber(0, b.getHeight()), 3, 3);
}
// Draw the Lines.
gfx.setColor(Color.ORANGE);
for (int i = 0; i < LINES; i++) {
int x = (int) randomNumber(0, b.getWidth() - 80);
int y = (int) randomNumber(0, b.getHeight());
gfx.drawLine(x, y, x + (int) randomNumber(0, 30), y
- (int) randomNumber(0, 30));
}
if (GRAPH) {
// Graph, Lines from Top to Bottom.
gfx.setColor(GRAPH_COLOR);
for (int i = 0; i < 17; i++) {
gfx.drawLine(5 + i * 15, b.getHeight(), 5 + i * 15, 0);
}
for (int i = 0; i < 3; i++) {
gfx.drawLine(b.getWidth(), i * 14, 0, i * 14);
}
}
gfx.dispose();
return b;
} catch (Exception e) {
return null;
}
}
public static BufferedImage toBufferedImage(Image image) {
if (image instanceof BufferedImage) {
return (BufferedImage) image;
}
// This code ensures that all the pixels in the image are loaded
image = new ImageIcon(image).getImage();
// Determine if the image has transparent pixels; for this method's
// implementation, see e661 Determining If an Image Has Transparent
// Pixels
boolean hasAlpha = false;
// Create a buffered image with a format that's compatible with the
// screen
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
try {
// Determine the type of transparency of the new buffered image
int transparency = Transparency.OPAQUE;
if (hasAlpha) {
transparency = Transparency.BITMASK;
}
// Create the buffered image
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null),
image.getHeight(null), transparency);
} catch (HeadlessException e) {
// The system does not have a screen
}
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
if (hasAlpha) {
type = BufferedImage.TYPE_INT_ARGB;
}
bimage = new BufferedImage(image.getWidth(null),
image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
}