diff --git a/src/main/java/tech/nevets/igformatter/GenerateRoute.java b/src/main/java/tech/nevets/igformatter/GenerateRoute.java index fb00edc..cd40fd9 100644 --- a/src/main/java/tech/nevets/igformatter/GenerateRoute.java +++ b/src/main/java/tech/nevets/igformatter/GenerateRoute.java @@ -6,6 +6,7 @@ import spark.Route; import javax.imageio.ImageIO; import javax.servlet.MultipartConfigElement; +import javax.servlet.http.Part; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.InputStream; @@ -14,29 +15,46 @@ public class GenerateRoute implements Route { @Override public Object handle(Request req, Response res) throws Exception { req.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("./temp")); - try (InputStream is = req.raw().getPart("image").getInputStream()) { + Part part = req.raw().getPart("image"); + if (part == null) { + res.status(400); + res.type("text/plain"); + return "No image uploaded"; + } + try (InputStream is = part.getInputStream()) { BufferedImage img = ImageIO.read(is); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int color; - boolean customDimensions; + String color; int width; int height; + int minBorder; try { - color = Integer.parseInt(req.queryParams("color")); - customDimensions = Boolean.parseBoolean(req.queryParams("customDimensions")); + color = req.queryParams("color"); width = Integer.parseInt(req.queryParams("width")); height = Integer.parseInt(req.queryParams("height")); + minBorder = Integer.parseInt(req.queryParams("minBorder")); } catch (final Exception e) { res.type("plain/text"); res.status(400); return "Error in sent parameters: " + e.getMessage(); } - ImageIO.write(Images.renderImage(img, color, customDimensions, width, height), "png", baos); + BufferedImage finalImg = Images.renderImage(img, color, width, height, minBorder); + if (finalImg == null) { + res.type("text/plain"); + res.status(400); + return "Dimensions too large, max 8000x6000"; + } + + ImageIO.write(finalImg, "png", baos); res.type("image/png"); return baos.toByteArray(); + } catch (Exception e) { + res.type("plain/text"); + res.status(500); + return "Error creating image: " + e.getMessage(); } } } diff --git a/src/main/java/tech/nevets/igformatter/Images.java b/src/main/java/tech/nevets/igformatter/Images.java index a6d323d..bb77a51 100644 --- a/src/main/java/tech/nevets/igformatter/Images.java +++ b/src/main/java/tech/nevets/igformatter/Images.java @@ -4,8 +4,13 @@ import java.awt.*; import java.awt.image.BufferedImage; public class Images { - public static BufferedImage renderImage(BufferedImage img, int color, boolean customDimensions, int customWidth, int customHeight) { - BufferedImage image = generateBackground(color); + public static BufferedImage renderImage(BufferedImage img, String color, int totalWidth, int totalHeight, int minBorder) { + if (totalWidth > 8000 || totalHeight > 6000) { + System.out.println("Input too large"); + return null; + } + + BufferedImage image = generateBackground(color, totalWidth, totalHeight); Graphics2D g = image.createGraphics(); int width; @@ -13,31 +18,23 @@ public class Images { int xPos; int yPos; - if (customDimensions) { - width = customWidth; - height = customHeight; - xPos = 0; - yPos = 0; + int oldWidth = img.getWidth(); + int oldHeight = img.getHeight(); + if (oldWidth > oldHeight) { + width = (totalWidth - (minBorder * 2)); + height = (width * oldHeight) / oldWidth; + xPos = minBorder; + yPos = (totalHeight - height) / 2; + } else if (oldHeight > oldWidth) { + height = (totalWidth - (minBorder * 2)); + width = (oldWidth * height) / oldHeight; + xPos = (totalWidth - width) / 2; + yPos = minBorder; } else { - int oldWidth = img.getWidth(); - int oldHeight = img.getHeight(); - - if (oldWidth > oldHeight) { - width = 1048; - height = (width * oldHeight) / oldWidth; - xPos = 16; - yPos = (1080 - height) / 2; - } else if (oldHeight > oldWidth) { - height = 1048; - width = (oldWidth * height) / oldHeight; - xPos = (1080 - width) / 2; - yPos = 16; - } else { - width = 1048; - height = 1048; - xPos = 16; - yPos = 16; - } + width = (totalWidth - (minBorder * 2)); + height = (totalHeight - (minBorder * 2)); + xPos = minBorder; + yPos = minBorder; } g.drawImage(resizeImage(img, width, height), xPos, yPos, width, height, null); @@ -56,12 +53,16 @@ public class Images { return resizedImage; } - public static BufferedImage generateBackground(int color) { - BufferedImage image = new BufferedImage(1080, 1080, BufferedImage.TYPE_INT_ARGB); + private static int hexToInt(String hex) { + return Integer.parseInt(hex, 16); + } + + public static BufferedImage generateBackground(String color, int width, int height) { + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = image.createGraphics(); - g2d.setColor(new Color(color)); - g2d.setPaint(new Color(color)); - g2d.fillRect(0, 0, 1080, 1080); + g2d.setColor(new Color(hexToInt(color.substring(1)))); + g2d.setPaint(new Color(hexToInt(color.substring(1)))); + g2d.fillRect(0, 0, width, height); g2d.dispose(); return image; }