diff --git a/src/main/java/lc/captchas/FontFunCaptcha.java b/src/main/java/lc/captchas/FontFunCaptcha.java index 6cf533c..18fe53d 100644 --- a/src/main/java/lc/captchas/FontFunCaptcha.java +++ b/src/main/java/lc/captchas/FontFunCaptcha.java @@ -58,9 +58,9 @@ public class FontFunCaptcha implements ChallengeProvider { return null; } - private byte[] fontFun(String captchaText, String level, String path) { + private byte[] fontFun(final int width, final int height, String captchaText, String level, String path) { String[] colors = {"#f68787", "#f8a978", "#f1eb9a", "#a4f6a5"}; - BufferedImage img = new BufferedImage(350, 100, BufferedImage.TYPE_INT_RGB); + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = img.createGraphics(); for (int i = 0; i < captchaText.length(); i++) { Font font = loadCustomFont(level, path); @@ -83,8 +83,11 @@ public class FontFunCaptcha implements ChallengeProvider { public Challenge returnChallenge(String level, String size) { String secret = HelperFunctions.randomString(7); + final int[] size2D = HelperFunctions.parseSize2D(size); + final int width = size2D[0]; + final int height = size2D[1]; String path = "./lib/fonts/"; - return new Challenge(fontFun(secret, "medium", path), "image/png", secret.toLowerCase()); + return new Challenge(fontFun(width, height, secret, "medium", path), "image/png", secret.toLowerCase()); } public boolean checkAnswer(String secret, String answer) { diff --git a/src/main/java/lc/captchas/PoppingCharactersCaptcha.java b/src/main/java/lc/captchas/PoppingCharactersCaptcha.java index 5027891..d5c4cdd 100644 --- a/src/main/java/lc/captchas/PoppingCharactersCaptcha.java +++ b/src/main/java/lc/captchas/PoppingCharactersCaptcha.java @@ -21,10 +21,8 @@ import lc.misc.GifSequenceWriter; public class PoppingCharactersCaptcha implements ChallengeProvider { private final Font font = new Font("Arial", Font.ROMAN_BASELINE, 48); - private final int width = 250; - private final int height = 100; - private Integer[] computeOffsets(final String text) { + private Integer[] computeOffsets(final int width, final int height, final String text) { final var img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); final var graphics2D = img.createGraphics(); final var frc = graphics2D.getFontRenderContext(); @@ -41,7 +39,7 @@ public class PoppingCharactersCaptcha implements ChallengeProvider { return advances.toArray(new Integer[]{}); } - private BufferedImage makeImage(final Consumer f) { + private BufferedImage makeImage(final int width, final int height, final Consumer f) { final var img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); final var graphics2D = img.createGraphics(); graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); @@ -56,16 +54,16 @@ public class PoppingCharactersCaptcha implements ChallengeProvider { return HelperFunctions.randomNumber(-2, +2); } - private byte[] gifCaptcha(final String text) { + private byte[] gifCaptcha(final int width, final int height, final String text) { try { final var byteArrayOutputStream = new ByteArrayOutputStream(); final var output = new MemoryCacheImageOutputStream(byteArrayOutputStream); final var writer = new GifSequenceWriter(output, 1, 900, true); - final var advances = computeOffsets(text); + final var advances = computeOffsets(width, height, text); final var prevColor = Color.getHSBColor(0f, 0f, 0.1f); IntStream.range(0, text.length()).forEach(i -> { final var color = Color.getHSBColor(HelperFunctions.randomNumber(0, 100)/100.0f, 0.6f, 1.0f); - final var nextImage = makeImage((g) -> { + final var nextImage = makeImage(width, height, (g) -> { if (i > 0) { final var prevI = (i - 1) % text.length(); g.setColor(prevColor); @@ -102,7 +100,10 @@ public class PoppingCharactersCaptcha implements ChallengeProvider { public Challenge returnChallenge(String level, String size) { final var secret = HelperFunctions.randomString(6); - return new Challenge(gifCaptcha(secret), "image/gif", secret.toLowerCase()); + final int[] size2D = HelperFunctions.parseSize2D(size); + final int width = size2D[0]; + final int height = size2D[1]; + return new Challenge(gifCaptcha(width, height, secret), "image/gif", secret.toLowerCase()); } public boolean checkAnswer(String secret, String answer) { diff --git a/src/main/java/lc/captchas/ShadowTextCaptcha.java b/src/main/java/lc/captchas/ShadowTextCaptcha.java index 7e9b71b..9ac92a9 100644 --- a/src/main/java/lc/captchas/ShadowTextCaptcha.java +++ b/src/main/java/lc/captchas/ShadowTextCaptcha.java @@ -38,8 +38,8 @@ public class ShadowTextCaptcha implements ChallengeProvider { return answer.toLowerCase().equals(secret); } - private byte[] shadowText(String text) { - BufferedImage img = new BufferedImage(350, 100, BufferedImage.TYPE_INT_RGB); + private byte[] shadowText(final int width, final int height, String text) { + BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Font font = new Font("Arial", Font.ROMAN_BASELINE, 48); Graphics2D graphics2D = img.createGraphics(); graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); @@ -76,6 +76,9 @@ public class ShadowTextCaptcha implements ChallengeProvider { public Challenge returnChallenge(String level, String size) { String secret = HelperFunctions.randomString(6); - return new Challenge(shadowText(secret), "image/png", secret.toLowerCase()); + final int[] size2D = HelperFunctions.parseSize2D(size); + final int width = size2D[0]; + final int height = size2D[1]; + return new Challenge(shadowText(width, height, secret), "image/png", secret.toLowerCase()); } } diff --git a/src/main/java/lc/misc/HelperFunctions.java b/src/main/java/lc/misc/HelperFunctions.java index 22b3a8a..9b196aa 100644 --- a/src/main/java/lc/misc/HelperFunctions.java +++ b/src/main/java/lc/misc/HelperFunctions.java @@ -11,6 +11,12 @@ public class HelperFunctions { random.setSeed(seed); } + public static int[] parseSize2D(final String size) { + final String[] fields = size.split("x"); + final int[] result = {Integer.parseInt(fields[0]), Integer.parseInt(fields[1])}; + return result; + } + public static void setRenderingHints(Graphics2D g2d) { g2d.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); diff --git a/src/main/scala/lc/captchas/DebugCaptcha.scala b/src/main/scala/lc/captchas/DebugCaptcha.scala index 4f2bbb0..8c3a605 100644 --- a/src/main/scala/lc/captchas/DebugCaptcha.scala +++ b/src/main/scala/lc/captchas/DebugCaptcha.scala @@ -45,14 +45,14 @@ class DebugCaptcha extends ChallengeProvider { matches } - private def simpleText(text: String): Array[Byte] = { - val img = new BufferedImage(350, 100, BufferedImage.TYPE_INT_RGB) + private def simpleText(width: Int, height: Int, text: String): Array[Byte] = { + val img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) val font = new Font("Arial", Font.ROMAN_BASELINE, 56) val graphics2D = img.createGraphics() val textLayout = new TextLayout(text, font, graphics2D.getFontRenderContext()) HelperFunctions.setRenderingHints(graphics2D) graphics2D.setPaint(Color.WHITE) - graphics2D.fillRect(0, 0, 350, 100) + graphics2D.fillRect(0, 0, width, height) graphics2D.setPaint(Color.BLACK) textLayout.draw(graphics2D, 15, 50) graphics2D.dispose() @@ -68,6 +68,9 @@ class DebugCaptcha extends ChallengeProvider { def returnChallenge(level: String, size: String): Challenge = { val secret = HelperFunctions.randomString(6, HelperFunctions.safeAlphabets) - new Challenge(simpleText(secret), "image/png", secret.toLowerCase()) + val size2D = HelperFunctions.parseSize2D(size) + val width = size2D(0) + val height = size2D(1) + new Challenge(simpleText(width, height, secret), "image/png", secret.toLowerCase()) } } diff --git a/src/main/scala/lc/captchas/FilterChallenge.scala b/src/main/scala/lc/captchas/FilterChallenge.scala index ef3bbc2..dbf0771 100644 --- a/src/main/scala/lc/captchas/FilterChallenge.scala +++ b/src/main/scala/lc/captchas/FilterChallenge.scala @@ -10,6 +10,7 @@ import lc.captchas.interfaces.Challenge import java.util.{List => JavaList, Map => JavaMap} import java.io.ByteArrayOutputStream import lc.misc.PngImageWriter +import lc.misc.HelperFunctions class FilterChallenge extends ChallengeProvider { def getId = "FilterChallenge" @@ -35,7 +36,10 @@ class FilterChallenge extends ChallengeProvider { val alphabet = "abcdefghijklmnopqrstuvwxyz" val n = 8 val secret = LazyList.continually(r.nextInt(alphabet.size)).map(alphabet).take(n).mkString - val canvas = new BufferedImage(225, 50, BufferedImage.TYPE_INT_RGB) + val size2D = HelperFunctions.parseSize2D(size) + val width = size2D(0) + val height = size2D(1) + val canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) val g = canvas.createGraphics() g.setColor(Color.WHITE) g.fillRect(0, 0, canvas.getWidth, canvas.getHeight) diff --git a/src/main/scala/lc/captchas/RainDropsCaptcha.scala b/src/main/scala/lc/captchas/RainDropsCaptcha.scala index 02dfd88..9b32d76 100644 --- a/src/main/scala/lc/captchas/RainDropsCaptcha.scala +++ b/src/main/scala/lc/captchas/RainDropsCaptcha.scala @@ -11,6 +11,7 @@ import lc.captchas.interfaces.ChallengeProvider import lc.captchas.interfaces.Challenge import lc.misc.GifSequenceWriter import java.util.{List => JavaList, Map => JavaMap} +import lc.misc.HelperFunctions class Drop { var x = 0 @@ -59,8 +60,9 @@ class RainDropsCP extends ChallengeProvider { def returnChallenge(level: String, size: String): Challenge = { val r = new scala.util.Random val secret = LazyList.continually(r.nextInt(alphabet.size)).map(alphabet).take(n).mkString - val width = 450 - val height = 100 + val size2D = HelperFunctions.parseSize2D(size) + val width = size2D(0) + val height = size2D(1) val imgType = BufferedImage.TYPE_INT_RGB val xOffset = 2 + r.nextInt(3) val xBias = (height / 10) - 2