生成前端小图片,以及对于大图片加背景颜色
package com.stock.core.util;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import sun.misc.BASE64Encoder;
public class RandomCutPicUtils {
private static final int BG_WIDTH = 590;
private static final int BG_HEIGHT = 360;
private static final int TEMPLATE_WIDTH = 120;
private static final int TEMPLATE_HEIGHT = 100;
private static final int CIRCLE_RADIO = 20;
private static int SLIDER_IMG_OUT_PADDING = 1;
public static Map<String, Object> generateTwoImage(InputStream bgPathInputStream) throws Exception {
Map<String, Integer> startPoint = getStartPoint();
int xBegin = startPoint.get("xBegin");
int yBegin = startPoint.get("yBegin");
int[][] templateImage = getBlockData();
BufferedImage bgImage = ImageIO.read(bgPathInputStream);
BufferedImage blankImage = new BufferedImage(TEMPLATE_WIDTH, TEMPLATE_HEIGHT,
BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D graphics = blankImage.createGraphics();
graphics.setBackground(Color.white);
cutByTemplate(bgImage, blankImage, templateImage, xBegin, yBegin);
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.setStroke(new BasicStroke(5, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
graphics.drawImage(blankImage, 0, 0, null);
graphics.dispose();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("image", getImageBASE64(bgImage));
resultMap.put("image2", getImageBASE64(blankImage));
resultMap.put("xBegin",xBegin);
resultMap.put("yBegin", yBegin);
return resultMap;
}
public static Map<String, String> generateTwoImageBase64(String bgPath)
throws Exception {
Map<String, Integer> startPoint = getStartPoint();
int xBegin = startPoint.get("xBegin");
int yBegin = startPoint.get("yBegin");
int[][] templateImage = getBlockData();
BufferedImage bgImage = ImageIO.read(new FileInputStream(bgPath));
BufferedImage blankImage = new BufferedImage(TEMPLATE_WIDTH, TEMPLATE_HEIGHT,
BufferedImage.TYPE_4BYTE_ABGR);
cutByTemplate(bgImage, blankImage, templateImage, xBegin, yBegin);
Map<String, String> resultMap = new HashMap<>(2);
resultMap.put("big", getImageBASE64(bgImage));
resultMap.put("small", getImageBASE64(blankImage));
return resultMap;
}
private static Map<String, Integer> getStartPoint() {
Random random = new Random();
int xBegin = random.nextInt(BG_WIDTH - 3*TEMPLATE_WIDTH) + 2*TEMPLATE_WIDTH + 5;
int yBegin = TEMPLATE_HEIGHT + random.nextInt(BG_HEIGHT - TEMPLATE_HEIGHT * 2);
Map<String, Integer> map = new HashMap<>(2);
map.put("xBegin", xBegin);
map.put("yBegin", yBegin);
return map;
}
private static int[][] getBlockData() {
int[][] data = new int[TEMPLATE_WIDTH][TEMPLATE_HEIGHT];
Random random = new Random();
double x1 = CIRCLE_RADIO + (TEMPLATE_WIDTH - 2 * CIRCLE_RADIO) / 2.0 - 5 + random.nextInt(10);
double y1_top = CIRCLE_RADIO - random.nextInt(3);
double y1_bottom = TEMPLATE_HEIGHT - CIRCLE_RADIO + random.nextInt(3);
double y1 = random.nextInt(2) == 1 ? y1_top : y1_bottom;
double x2_right = TEMPLATE_WIDTH - CIRCLE_RADIO - CIRCLE_RADIO + random.nextInt(2 * CIRCLE_RADIO - 4);
double x2_left = CIRCLE_RADIO + CIRCLE_RADIO - 2 - random.nextInt(2 * CIRCLE_RADIO - 4);
double x2 = random.nextInt(2) == 1 ? x2_right : x2_left;
double y2 = CIRCLE_RADIO + (TEMPLATE_HEIGHT - 2 * CIRCLE_RADIO) / 2.0 - 4 + random.nextInt(10);
double po = Math.pow(CIRCLE_RADIO, 2);
for (int i = 0; i < TEMPLATE_WIDTH; i++) {
for (int j = 0; j < TEMPLATE_HEIGHT; j++) {
boolean fill;
if ((i >= CIRCLE_RADIO && i < TEMPLATE_WIDTH - CIRCLE_RADIO)
&& (j >= CIRCLE_RADIO && j < TEMPLATE_HEIGHT - CIRCLE_RADIO)) {
data[i][j] = 1;
fill = true;
} else {
data[i][j] = 0;
fill = false;
}
double d3 = Math.pow(i - x1, 2) + Math.pow(j - y1, 2);
if (d3 < po) {
data[i][j] = 1;
} else {
if (!fill) {
data[i][j] = 0;
}
}
double d4 = Math.pow(i - x2, 2) + Math.pow(j - y2, 2);
if (d4 < po) {
data[i][j] = 0;
}
}
}
for (int i = 0; i < TEMPLATE_WIDTH; i++) {
for (int j = 0; j < TEMPLATE_HEIGHT; j++) {
for (int k = 1; k <= SLIDER_IMG_OUT_PADDING; k++) {
if (i >= CIRCLE_RADIO - k && i < CIRCLE_RADIO
&& ((j >= CIRCLE_RADIO - k && j < CIRCLE_RADIO)
|| (j >= TEMPLATE_HEIGHT - CIRCLE_RADIO - k && j < TEMPLATE_HEIGHT - CIRCLE_RADIO + 1))) {
data[i][j] = 2;
}
if (i >= TEMPLATE_WIDTH - CIRCLE_RADIO + k - 1 && i < TEMPLATE_WIDTH - CIRCLE_RADIO + 1) {
for (int n = 1; n <= SLIDER_IMG_OUT_PADDING; n++) {
if (((j >= CIRCLE_RADIO - n && j < CIRCLE_RADIO)
|| (j >= TEMPLATE_HEIGHT - CIRCLE_RADIO - n && j <= TEMPLATE_HEIGHT - CIRCLE_RADIO))) {
data[i][j] = 2;
}
}
}
}
if (data[i][j] == 1 && j - SLIDER_IMG_OUT_PADDING > 0 && data[i][j - SLIDER_IMG_OUT_PADDING] == 0) {
data[i][j - SLIDER_IMG_OUT_PADDING] = 2;
}
if (data[i][j] == 1 && j + SLIDER_IMG_OUT_PADDING > 0 && j + SLIDER_IMG_OUT_PADDING <= TEMPLATE_HEIGHT) {
if (j == 0 || (j+1) == TEMPLATE_HEIGHT){
data[i][j] = 2;
}else {
if (j + SLIDER_IMG_OUT_PADDING < TEMPLATE_HEIGHT && data[i][j + SLIDER_IMG_OUT_PADDING] == 0) {
data[i][j + SLIDER_IMG_OUT_PADDING] = 2;
}
}
}
if (data[i][j] == 1 && i - SLIDER_IMG_OUT_PADDING > 0 && data[i - SLIDER_IMG_OUT_PADDING][j] == 0) {
data[i - SLIDER_IMG_OUT_PADDING][j] = 2;
}
if (data[i][j] == 1 && i + SLIDER_IMG_OUT_PADDING > 0 && i + SLIDER_IMG_OUT_PADDING < TEMPLATE_WIDTH && data[i + SLIDER_IMG_OUT_PADDING][j] == 0) {
data[i + SLIDER_IMG_OUT_PADDING][j] = 2;
}
}
}
return data;
}
private static void cutByTemplate(BufferedImage bgImage, BufferedImage blankImage,
int[][] templateImage, int x, int y) {
for (int i = 0; i < TEMPLATE_WIDTH; i++) {
for (int j = 0; j < TEMPLATE_HEIGHT; j++) {
int _x = x + i;
int _y = y + j;
int rgbFlg = templateImage[i][j];
int rgb_ori = bgImage.getRGB(_x, _y);
if (rgbFlg == 1) {
blankImage.setRGB(i, j, rgb_ori);
bgImage.setRGB(_x, _y, rgb_ori & 0x363636);
} else if (rgbFlg == 2) {
blankImage.setRGB(i, j, Color.WHITE.getRGB());
bgImage.setRGB(_x, _y, Color.GRAY.getRGB());
} else if (rgbFlg == 0) {
blankImage.setRGB(i, j, rgb_ori & 0x00ffffff);
}
}
}
}
public static Map<String, BufferedImage> generateTwoImage(HttpSession session, HttpServletResponse response, String bgPath) throws Exception {
Map<String, Integer> startPoint = getStartPoint();
int xBegin = startPoint.get("xBegin");
int yBegin = startPoint.get("yBegin");
int[][] templateImage = getBlockData();
BufferedImage bgImage = ImageIO.read(new FileInputStream(bgPath));
BufferedImage blankImage = new BufferedImage(TEMPLATE_WIDTH, TEMPLATE_HEIGHT,
BufferedImage.TYPE_4BYTE_ABGR);
cutByTemplate(bgImage, blankImage, templateImage, xBegin, yBegin);
Map<String, BufferedImage> resultMap = new HashMap<>(2);
resultMap.put("big", bgImage);
resultMap.put("small", blankImage);
return resultMap;
}
private static String getImageBASE64(BufferedImage image) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, "png", out);
byte[] b = out.toByteArray();
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(b);
}
public static void outputImageFile(BufferedImage image, String imagePath) throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] newImages = os.toByteArray();
FileOutputStream fos = new FileOutputStream(imagePath);
fos.write(newImages);
fos.close();
}
public static void outputImageFile(BufferedImage image, File imagePath) throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image, "png", os);
byte[] newImages = os.toByteArray();
FileOutputStream fos = new FileOutputStream(imagePath);
fos.write(newImages);
fos.close();
}
}
如何使用
@PostMapping("/getImg")
@ResponseBody
public JsonResponse<Map<String, Object>> createCodePlus() throws Exception {
JsonResponse<Map<String, Object>> responseTemp = new JsonResponse<Map<String, Object>>();
Map<String, Object> rtnMap = new HashMap<String, Object>();
Random randomImages = new Random();
String picPath = "templates/randomImg/" + randomImages.nextInt(20) + ".png";
picPath = URLDecoder.decode(picPath,"utf-8");
Resource resource = new ClassPathResource(picPath);
rtnMap = RandomCutPicUtils.generateTwoImage(resource.getInputStream());
rtnMap.remove("xBegin");
responseTemp.setResult(rtnMap);
return responseTemp;
}