escribir delante
Este artículo fue escrito por mí en febrero de 2020 y se publicó por primera vez en mi blog personal: xeblog.cn/articles/32 .
La causa del incidente: En ese momento, un amigo me envió una foto y me pidió que le diera una foto P, diciendo que le daría su código de pago de WeChat a P, pensé que era muy interesante, así que se lo di. P, esta P está fuera de control, y la gente viene a verme esta imagen todos los días.
Después de pensarlo bien, ¿qué problemas nos pueden estar molestando a los programadores? No se te ocurre la idea de usar código para sintetizar imágenes, jajaja~
Dirección de la experiencia:xeblog.cn/tools/1.htm…
Primero vaya a WeChat para generar el código de colección de WeChat (reciba el pago -> colección de código QR -> guarde el código de colección), luego cárguelo, luego seleccione su dispositivo, elija Android para teléfonos Android, elija Apple para teléfonos Apple y finalmente haga clic en para iniciar la síntesis Eso es todo.
etapa de preparación
Imagen original (de Internet)
Mapa de plantilla después del procesamiento de PS
Imagen a sintetizar
síntesis de imagen
Los pasos básicos
- Lea la imagen de la plantilla y la imagen que se va a sintetizar, y ajuste el tamaño, el ángulo de rotación, el brillo y el contraste de la imagen que se va a sintetizar;
- Cree una imagen en blanco con las mismas dimensiones que la imagen de la plantilla;
- Cree un
Graphics2D
objeto y useGraphics2D
eldrawImage()
método para dibujar la imagen que se va a sintetizar y la imagen de la plantilla en la posición especificada de la imagen en blanco (debe prestar atención al orden de las capas, primero dibuje la imagen que se va a sintetizar y luego dibuje la imagen de la plantilla); - Envía una imagen en blanco (imagen compuesta) al local.
código
Se utilizan el ajuste y la rotación del tamaño de la imagen Thumbnailator
, es necesario agregar Maven
dependencias
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
复制代码
/**
* 横坐标
*/
private static final int x = 457;
/**
* 纵坐标
*/
private static final int y = 295;
/**
* 旋转角度
*/
private static final double angle = 16;
/**
* 缩放比例
*/
private static final double scale = 0.18;
/**
* 图片合成
*
* @param imagePath 待合成的图片路径
* @param outPath 合成后的图片输出路径
* @throws IOException
*/
private static void synthesis(String imagePath, String outPath) throws IOException {
// 模板图
BufferedImage template = ImageIO.read(new File("D:\\local\\images\\template.png"));
// 待合成图
BufferedImage image = ImageIO.read(new File(imagePath));
// 调整待合成图的尺寸和旋转角度
image = Thumbnails.of(image).scale(scale).rotate(angle).asBufferedImage();
// 合成后的图
BufferedImage result = new BufferedImage(template.getWidth(), template.getHeight(), template.getType());
Graphics2D graphics2D = result.createGraphics();
// 先画待合成图,后画模板图,这样就能将待合成图放置在模板图的下层
graphics2D.drawImage(image, x, y, null);
graphics2D.drawImage(template,0,0, null);
graphics2D.dispose();
ImageIO.write(result, "png", new File(outPath));
}
复制代码
ejecutar el código
public static void main(String[] args) throws IOException {
synthesis("D:\\local\\images\\weixin_payment_code.png", "D:\\local\\images\\result.png");
}
复制代码
Ajustar el brillo y el contraste de la imagen
/**
* 调整亮度、对比度
*
* @param image
*/
private static void adjustBrightnessAndContrast(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
Color color = new Color(image.getRGB(x, y));
int red = calculateColor(color.getRed());
int green = calculateColor(color.getGreen());
int blue = calculateColor(color.getBlue());
color = new Color(red, green, blue);
image.setRGB(x, y, color.getRGB());
}
}
}
/**
* 亮度,取值范围[-1,1]
*/
private static final double BRIGHTNESS = 0;
/**
* 对比度,取值范围[-1,1]
*/
private static final double CONTRAST = -0.5;
/**
* 计算亮度、对比度颜色值
*
* @param color 原颜色值
* @return 返回计算后的颜色值
*/
private static int calculateColor(int color) {
color = (int)((color - 127.5 * (1 - BRIGHTNESS)) * Math.tan((45 + 44 * CONTRAST) / 180 * Math.PI) + 127.5 * (1 + BRIGHTNESS));
return getColor(color);
}
/**
* 获取范围内的颜色值,[0,255]
*
* @param color
* @return
*/
private static int getColor(int color) {
return color > 255 ? 255 : color < 0 ? 0 : color;
}
复制代码
Después de procesar el tamaño y el ángulo de rotación de la imagen que se va a sintetizar, llame al adjustBrightnessAndContrast()
método para ajustar el brillo y el contraste
...
// 调整待合成图的尺寸和旋转角度
image = Thumbnails.of(image).scale(scale).rotate(angle).asBufferedImage();
// 调整待合成图片的亮度、对比度
adjustBrightnessAndContrast(image);
...
复制代码
vuelva a ejecutar el código
Dirección de la experiencia:xeblog.cn/tools/1.htm…
Participo en el "Concurso de desarrollo creativo" para obtener más detalles, consulte: ¡El Concurso de desarrollo creativo de Nuggets ya está aquí!