用java代码帮朋友P图

Vanna ·
更新时间:2024-11-13
· 1886 次阅读

目录

引言

准备阶段

图片合成

基本步骤

代码

运行代码

调整图片亮度、对比度

引言

事件起因:当时有个朋友发了张图片给我,让我给他P图,说是让我给他把自己的微信付款码给P上去,我觉得也挺有意思的,就给他P了,这一P就一发不可收拾了,天天都有人来找我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); ...

重新运行代码

以上就是用java代码帮朋友P图的详细内容,更多关于java代码P图的资料请关注软件开发网其它相关文章!



用java JAVA

需要 登录 后方可回复, 如果你还没有账号请 注册新账号