java使用Graphics2D进行图片文字合成示例

JAVA原生图片处理:Graphics2D海报(一) import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.TextAttribute; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.text.Attribu... 阅读详情

功能介绍:通过Graphics2D在一张背景图上添加文字描述和图片。
合成效果示意图:
在这里插入图片描述

代码示例:
在代码中对每步操作做了详细的注释

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.swing.JLabel;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sinolife.sf.store.SFFile;
import com.sinolife.sf.store.TempFileFactory;

public class DrawImgtest{
	
	private static final Logger logger = LoggerFactory.getLogger(DrawImgtest.class);
	
	private static TempFileFactory temFileFactory = TempFileFactory.getInstance(DrawImgtest.class);
	
	public static final String realPath = "C:\\Users\\yyyL\\Desktop\\合成\\";
	public static final String backgroundImage = "background.png"; // 背景图片
	public static final String qrCode = "qrCode.png"; // 二维码图片
	public static final String card = "card-big-8.png"; // 插入的小卡片

	
	private static String userId="121212122";
	
	public static void main(String[] args) throws Exception {
		
		Map<String, String> imageInfo1 = new HashMap<String, String>();
		imageInfo1.put("img", card);
		imageInfo1.put("desc", "小图上面的描述");
		ByteArrayOutputStream outStream = compose(imageInfo1);
		
		// TODO 保存生成的新图片
		File outputfile = new File(realPath+"合成.png");
        if (!outputfile.getParentFile().exists()) {
            outputfile.getParentFile().mkdirs();
        }
        FileOutputStream fs = new FileOutputStream(outputfile);
        fs.write(outStream.toByteArray());
        fs.flush();
        fs.close();

		FileOutputStream out = null;
		try {
			// 将文件临时保存
			SFFile tempFile = temFileFactory.createTempFile();
			out = tempFile.openOutputStream();
			byte[] b = outStream.toByteArray();
			out.write(b);
			out.flush();
			
			// TODO 后面可以通过 tempFile进行文件上传啥的
			
		} catch (Exception e) {
			try {
				if (outStream != null) {
					outStream.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
			
	}
	
	private static ByteArrayOutputStream compose(Map<String,String> imageInfo1) {
        OutputStream out = null;
        try {
            // 加载背景图片
            BufferedImage imageLocal = ImageIO.read(new File(realPath+backgroundImage));
            int backgroundWidth = imageLocal.getWidth();
            int backgroundHeight = imageLocal.getHeight();
            addText(imageLocal, "1张贺岁卡", new Font("微软雅黑", Font.PLAIN, 35),new Color(238, 65, 53),backgroundWidth,250);

            // 待插入卡片图片
            BufferedImage image1 = ImageIO.read(new File(realPath+imageInfo1.get("img")));
            addText(image1, imageInfo1.get("desc"), new Font("微软雅黑", Font.PLAIN, 48),new Color(252, 219, 179),image1.getWidth(),70);
            
            // 待插入二维码  190 200
            BufferedImage qrCodeImg = ImageIO.read(new File(realPath+qrCode));
            
            // 以背景图片为模板
            Graphics2D g2d = imageLocal.createGraphics();
            
            // 这里必须要先压缩小图大小,然后再合成,不压缩直接合成会造成小图不清晰
            image1 = disposeImage(image1, 410, 550);
            
            // TODO 输出小图
    		File outputfile1 = new File(realPath+"小图.png");
            if (!outputfile1.getParentFile().exists()) {
                outputfile1.getParentFile().mkdirs();
            }
            ImageIO.write(image1, "png", outputfile1);
            
            // 将小图绘画在背景图片上,生成新图片, drawImage方法参数的x和y:绘制点距离左边距和上边距的像素。 width和height:表示绘制的小图的大小
            g2d.drawImage(image1, (backgroundWidth - 410)/2, (backgroundHeight - 550)/2-90, 410, 550, null);
            g2d.drawImage(qrCodeImg, (backgroundWidth - 150)/2, backgroundHeight-260, 150, 150, null);
            g2d.dispose();
            
            // 生成的新图片写入文件流
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            ImageIO.write(imageLocal, "png", outStream);
			return outStream;
        } catch (Exception e) {
        	logger.error("DrawImgtest compose Exception: userId={}", userId, e);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
        return null;
    }
	
	/**
	 * 压缩图片大小
	 * @param src
	 * @param newWidth 新图片的宽度
	 * @param newHeight 新图片的高度
	 * @return
	 * @date 2021年11月23日
	 */
	private static BufferedImage disposeImage(BufferedImage image, int newWidth, int newHeight) {
		// 得到源图长
		BufferedImage newImg = null;
		// 判断输入图片的类型
		switch (image.getType()) {
		case 13:
			newImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_4BYTE_ABGR);
			break;
		default:
			newImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
			break;
		}
		Graphics2D g = newImg.createGraphics();
		g.drawImage(image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
		g.dispose();
		return newImg;
	}
	
	/**
	 * 渲染文字
	 * @param image1
	 * @param text
	 * @param font
	 * @param color
	 * @param width
	 * @param height
	 * @date 2021年12月15日
	 */
	private static void addText(BufferedImage image1,String text,Font font,Color color, int width, int height) {
		if(StringUtils.isBlank(text)) {
			return;
		}
		Graphics2D g2d = image1.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        JLabel jLabel = new JLabel();
        FontMetrics fm = jLabel.getFontMetrics(font);
        int textLength = fm.stringWidth(text);
        g2d.setFont(font);
        g2d.setColor(color);
        g2d.drawString(text, (width - textLength) / 2,height); //  设置文字的内容居中,渲染位置
        g2d.dispose();// 主动释放Graphics
	}
}


Java图片添加文字与二维码并以流形式返回前端实战 本章系统地讲解了如何使用Java的Graphics2D类进行文本绘制,包括获取上下文、设置渲染属性、绘制文本、抗锯齿优化、多语言支持等核心内容。通过代码示例与流程图、表格的结合,不仅帮助读者理解基本操作,还引导他们进行更深入的优化与拓展。在后续章节中,我们将进一步探讨如何将文本与二维码结合,实现更复杂的图像合成与输出功能。ZXing 是一个开源的多格式图像处理库,支持包括 QR Code、Data Matrix、UPC、EAN 等多种条码格式。其核心模块为zxing-core。 阅读详情

相关推荐

麒麟V10系统下微信PC版安装全攻略:从源配置到一键安装(附常见问题解决)

本文详细介绍了在麒麟V10系统下安装和优化微信PC版的完整流程,包括系统环境准备、软件源配置、多途径安装方案以及性能优化技巧。特别针对国产操作系统用户,提供了从基础安装到高级配置的一站式解决方案,并附有常见问题排查方法,帮助用户快速实现微信PC版的高效运行。

weixin_30500105的博客 715

java实现在图片上绘制文本,生成新的图片

java实现在图片上绘制文本,生成新的图片。

kyrielx的博客 926

钣金设计高薪进阶:从材料工艺到DFMA降本增效全解析

钣金设计是机械制造领域的核心技术之一,它涉及将金属板材通过切割、折弯、焊接等工艺成型为所需零件。其核心原理在于深刻理解材料特性、制造工艺约束与结构力学,以确保设计在功能、成本与可制造性之间取得最佳平衡。这项技术的价值在于,优秀的钣金设计能直接驱动产品降本增效,通过优化材料利用率、简化装配工序和避免设计缺陷,为企业节省大量模具与生产成本。其应用场景广泛,从机箱机柜、汽车部件到电子设备外壳无处不在。本文将聚焦于实现这一价值的关键路径,深入探讨面向制造与装配的设计(DFMA)原则在钣金领域的实战应用,并剖析如何通

weixin_34301132的博客 391

Java-如何使用Java将图片和文字拼接在一起(并非是给图片加水印)

由前端来下载就显得非常让人焦灼了,前端只能使用下载的这台电脑的性能来一张一张的下载小程序码并拼接门店的信息,1000多张小程序码的话,就需要10分钟左右的等待时间,有的客户的电脑性能比较差的话,干脆就没办法下载,怎么办呢?问题背景:项目中,有一个功能,管理端可以将客户创建的小程序码下载到本地,方便客户将对应门店的小程序码打印出来并张贴到门店,做门店的引流和会员入会。

Daopin Blog 2132

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6036

从USB相机标定到Aruco码精准定位:基于aruco-ros的机器人视觉实践

本文详细介绍了基于aruco-ros的机器人视觉实践,从USB相机标定到Aruco码精准定位的全流程。通过实战案例和优化技巧,展示了Aruco码在机器人导航中的高精度位姿识别能力,帮助开发者快速实现毫米级视觉定位系统。

weixin_27310417的博客 487

java绘图-根据图片文字动态生成图片(Graphics2D)

今天在做热敏打印机打印二维码,并有文字描述,想到的简单的方法就是根据热敏打印机的纸张宽度和高度,生成对应的图片,如下: package com.orisdom.utils; import lombok.extern.slf4j.Slf4j; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInput

lisheng19870305的专栏 1328

告别单一查询!MultiQueryRetriever在LangChain中的高级用法解析

本文深入解析了LangChain中的MultiQueryRetriever高级用法,该工具通过大语言模型自动生成多样化查询,显著提升文档检索的召回率和准确性。文章详细介绍了其核心机制、高级配置调优策略以及在多语言和专业领域中的实际应用,为开发者提供了优化知识库问答系统的实用方案。

weixin_28730927的博客 271

Java生成图片,Graphics生成图片,Graphics2D生成图片,Awt生成图片

方法一、使用Graphics import java.awt.*; import java.awt.image.*; import javax.imageio.*; import java.io.*; public static void main(String[] args) { int imageWidth = 128;//图片的宽度 int imageHei

心如止水,万事皆成。心态决定我的成功。2013-05-01下定决心。2014-05-11人生的转折点 1万+

通信算法之267 : DJI无人机 云哨 DroneID 640ms

消费级无人机可以用于高级航拍、物流和人道主义救援等等。但是其广泛使用给安全、安保和隐私带来了许多风险。例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损失。为了防止恶意使用,无人机制造商采用多种对策来强制安全可靠地使用无人机,例如对速度和高度施加软件限制,或使用地理围栏实施禁飞区。作为对传统对策的补充,市场领导者大疆(DJI)为无人机实施了一种称为 DroneID 的跟踪协议,该协议旨在将无人机及其操作员的位置传输给授权实体,例如执法部门或关键基础设施的运营商。

leegang12的专栏 3307

infercnv的实操

摘要: 博主在infercnv分析中遇到执行困难,外包服务不可靠(未按要求使用HMM方法)。通过优化策略(逐样本处理、精简细胞至1000个、固定随机种子)解决了运行问题,但HMM功能仍无法实现。最终参考Cell期刊标准设置阈值完成分析,后续将继续更新进展。该案例凸显了生物信息分析中自主优化的重要性。(150字)

xiaoyusang的博客 308

Java Graphics2D 在图片上绘制文字和图片

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import j...

殇依依的博客 4391

YOLOv12改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 什么!不知道如何改进模型⁉️ 本专栏所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行,性价比极高。2️⃣ 找不到合适的模块⁉️ 所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,并进行二次创新,新颖度高,创新度高,能够适应不同的任务场景。3️⃣ 不确定自己改进的步骤、结果是否正确⁉️ 订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容,非常适合新手。4️⃣ 团队内发表数篇SCI论

Limiiiing的博客 2万+

java graphics2d 写入文字_java-使用Graphics2d合成图片和文字

需求:使用一些图片和用户输入的文案合成图片或者海报使用三方库mvn管理com.twelvemonkeys.imageioimageio-jpeg3.6com.twelvemonkeys.imageioimageio-tiff3.6com.twelvemonkeys.servletservlet3.6实现方法循环合成所有需求import com.aaa.bbb.common.utils.HttpsU...

weixin_34034295的博客 1056

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java合成图片及文字--Graphics2D

版权声明 : 本文为博主原创文章,如需转载,请注明出处(https://blog.youkuaiyun.com/F1004145107/article/details/84317601) 本文包含俩部分,使用的是 java.awt.Graphics2D类 1.生成二维码(彩色二维码,去白边) 2.将二维码、文字合成...

欢迎来到wise哲的博客空间 2194

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JAVA Graphics2D 合成与图片添加文字

由于业务需要需在背景图上 1.动态写上研报标题和作者并达到自动换行 2.将微信小程序二维码合成在背景图上 效果如下图 代码如下为方便将此编写成工具类 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; impo...

Architect_优快云的博客 3721

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java生成带文字的图片_Java在背景图片上面加文字或者文字自动生成图片

正巧遇到一个项目需要图片合成,查阅了网上许多资料之后整理了一份生成图片的工具类,代码如下:package org.yygzs.acker.util;import java.io.IOException;import javax.imageio.ImageIO;import java.io.File;import java.awt.Font;import java.awt.Graphics2D;im...

weixin_39864738的博客 1670

使用Graphics2D合成图片与文字

使用Graphics2D合成图片与文字

随心的博客 626

JAVA 绘图 Linux下中文乱码、centos 安装中文字体

CentOs服务器下,Java 使用Graphics2D向图片中合成文字,显示小方框。 //背景图 File bgImageFile = new File(bgImageName); BufferedImage big = ImageIO.read(bgImageFile); //合成的图片 Graphics2D graphics = big.createGraphics(); // 设置字体为黑色 graphics.setPaint(Color.BLACK); // 画笔粗细

代码小疯子 2171

java合成海报的工具类(二维码、头像、海报)

参考网站 https://my.oschina.net/u/2426590/blog/3027726 java Graphics2D绘制文字并居中并解决服务器乱码问题 https://blog.youkuaiyun.com/w410589502/article/details/72898184 我自己的代码: import java.awt.Color; import java.aw...

linhaibing009的博客 3332

Graphics2D类基本使用

Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供、坐标转换、颜色管理以及文字布局等更精确的控制。 一、绘图属性 Graphics2D定义了几种方法,用于添加或改变图形的状态属性。可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式;设定平移、旋转、缩放或修剪变换图形;以及设定填充图形的颜色和图案等。图形状态属性用特定的对象存储。 1. stroke属性 stroke属性控制线条的宽度、笔形样式、

qq_44132240的博客 1万+

java使用Graphics2D生成图片

实际图片数据库中只存了一个二维码转的base64的数组,直接导出只有一个二维码。logo的数组我删了一部分,二维码的可以直接用。这里使用 Graphics2D 画图。

weixin_45352783的博客 641

java进行图片合成以及写入自定义字体

由于工作需要做了一个利用java的Graphics2D进行图片合成且在图片上写入自定义字体文字的小功能,那就顺便记录一些痕迹,有什么不好的地方请见谅public static void main(String[] args){ try { //创建画布 BufferedImage image = new BufferedImage(480,270,Buffe...

qq_28600665的博客 6209

java 图片数字水印_java_如何使用JAVA实现数字水印,数字水印有可见不可见之分, - phpStudy...

如何使用JAVA实现数字水印数字水印有可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等。用java实现可见的数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下AlphaComposite类:AlphaComposite类是关于两个目标重叠的混合处理类,此类实现的特定规则是 T. Porter 和 T....

weixin_31262911的博客 397

Java实现底图和二维码图片合并工具类

本文介绍了一个基于Java标准库实现的图片合成工具类ImageOverlayUtil,可将二维码等图片叠加到底图的指定位置,并在下方添加可自定义位置的编号文本。该工具类通过Graphics2D实现图像合成,支持设置叠加位置、文本内容、字体样式和颜色等参数。关键功能包括:加载底图和叠加图、创建合成画布、绘制图片和文本、保存结果文件。特别提供了文本居中计算的辅助方法,并强调了资源释放的重要性。文中包含完整代码实现、详细解释和使用示例。

J_liaty的博客 1020

java 数字水印_如何使用JAVA实现数字水印

数字水印有可见不可见之分,可见的比如课件上印有学校校徽,微博发图片会水印上上传者的信息及微博logo等。用java实现可见的数字水印,草人主要是用到了java.awt包中的AlphaComposite类,当然在实现之前先介绍一下AlphaComposite类:AlphaComposite类是关于两个目标重叠的混合处理类,此类实现的特定规则是 T. Porter 和 T. Duff 合著的 “Com...

weixin_42501033的博客 787
上一篇: (六)Docker常用软件运行
下一篇: (二)SpringCloud-Eureka注册中心
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值