首页 > 文章列表 > 怎么用java代码P图

怎么用java代码P图

java
114 2023-05-01

怎么用java代码P图

准备阶段

原图(来源于网络)

PS处理后的模板图

待合成图片

图片合成

基本步骤

  • 读取模板图和待合成图,调整待合成图的尺寸、旋转角度、亮度、对比度;

  • 创建一个与模板图尺寸一致的空白图像;

  • 创建 Graphics2D 对象,通过 Graphics2D 对象的 drawImage() 方法将待合成图和模板图绘制进空白图像的指定位置(需要注意图层顺序,先绘制待合成图,后绘制模板图);

  • 输出空白图像(合成后的图像)到本地。

代码

图片尺寸调整、旋转使用到了 Thumbnailator, 需添加 Maven 依赖

<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));

}

运行代码

public static void main(String[] args) throws IOException {

	synthesis("D:\\local\\images\\weixin_payment_code.png", "D:\\local\\images\\result.png");

}

调整图片亮度、对比度

/**

 * 调整亮度、对比度

 *

 * @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;

}

在处理待合成图片的尺寸和旋转角度后调用 adjustBrightnessAndContrast() 方法调整亮度和对比度

...

// 调整待合成图的尺寸和旋转角度

image = Thumbnails.of(image).scale(scale).rotate(angle).asBufferedImage();

// 调整待合成图片的亮度、对比度

adjustBrightnessAndContrast(image);

...

重新运行代码