JAVA:文字写入图片、图片插入图片

news2024/11/13 15:57:54

一、前言

在实际应用中,需要通过Java将目标信息写在图片上,生成小卡片。

二、实现

1.定义一个工具类,代码如下:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class WenZi2Pic {
    public static void main(String[] args) {
        String modelPath = "D:\\368760.jpg";
        String sourcePath = "D:\\source1.png";
        String savePath = "D:\\result1.png";
        savePic("皮卡丘,你准备好与我并肩作战,共同征服这个世界了吗?",modelPath,sourcePath,savePath);
    }


    public static void savePic(String text,String modelPath,String sourcePath,String savePath){
        try {
            //新建图片或者导入模版图片
//            BufferedImage bufImage = createImage(100,200,1);
//            g.setColor(new Color(0xDCDCDC));
//            g.setColor(Color.WHITE);
//            g.fillRect(0,0,srcImgWidth,srcImgHeight);

            BufferedImage bufImage = ImageIO.read(new File(modelPath));

            BufferedImage imageNew = new BufferedImage(bufImage.getWidth(), bufImage.getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D g = imageNew.createGraphics();
            g.drawImage(bufImage, 0, 0, bufImage.getWidth(), bufImage.getHeight(), null);
            //字体的平滑处理
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

            //设置输出字体
            Font font = new Font("楷体", Font.BOLD, 50);
            g.setFont(font);
            g.setColor(Color.BLACK);
            //写字,注意:输入的坐标为第一个字左下角坐标
            g.drawString(text, 20, 500);
            //添加图片
            BufferedImage headImage = ImageIO.read(new File(sourcePath));
            g.drawImage(headImage,500, 600,null);
            g.dispose();
            //保存图片
            OutputStream fos = new FileOutputStream(savePath);
            ImageIO.write(imageNew, "png", fos);
            bufImage.flush();
            imageNew.flush();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }

    /**
     * 新建图片
     *
     * @param width     图片宽
     * @param height    图片高
     * @param imageType 图片类型
     * @return 图片实体
     */
    private static BufferedImage createImage(int width, int height, int imageType) {
        // 新建图片
        return new BufferedImage(width, height, imageType);
    }

    /**
     * 绘制背景
     * @param image    画布
     * @param graphics 画笔
     * @param bgColor  背景颜色
     */
    private static void fillBackground(BufferedImage image, Graphics graphics, Color bgColor) {
        int width = image.getWidth();
        int height = image.getHeight();
        graphics.setClip(0, 0, width, height);
        // 设置画笔颜色
        graphics.setColor(bgColor);
        // 绘制背景
        graphics.fillRect(0, 0, width, height);
    }
}

三、代码呈现效果 

输入文字:

皮卡丘,你准备好与我并肩作战,共同征服这个世界了吗?

 输入图片:

背景图片:368760.jpg

待插入图片:source1.png

 输出图片:result1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++(1)基础语法

C(1)之基础语法 Author: Once Day Date: 2024年8月29日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 参考文…

使用控制台与键盘进行输入输出

1、控制台简介与初始化 计算机在上电启动后,显示器被默认配置成80x25列的文本显示模式 。其使用从0xb8000开始,一共32KB的显存用于显示。如要在屏幕上指定位置显示特定的字符,则只需找到该位置对应的显存地址,写入2字节的数据&am…

ctfshow之web58~web71

目录 web58 思路一: 思路二: 思路三: web59~web65 web66~web67 web68~web70 web71 web58 if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); } PHP eval() 函数介绍 定义和用法 eval() 函数把字符串按…

【Sceneform-EQR】通过filament(gltfio)加载gltf模型动画(Filament使用Animator)

Sceneform-EQR 简介 Sceneform-EQR是EQ基于sceneform(filament)扩展的一个用于安卓端的三维渲染器。 相关链接 Git仓库 Sceneform-EQR 码云 EQ-Renderer的示例工程 EQ-R相关文档 文档目录CSDN专栏 实现通过filament加载gltf模型动画 运行示例 …

U盘无法访问?揭秘原因与高效恢复策略

一、U盘困境深度剖析 在日常的数字生活中,U盘作为我们存储和传输数据的重要工具,其重要性不言而喻。然而,当U盘突然显示“无法访问”时,这种突如其来的困境往往让人措手不及。U盘无法访问的现象可能由多种原因造成,包…

Question mutiple pdf‘s using openai, pinecone, langchain

题意:使用 OpenAI、Pinecone 和 LangChain 对多个 PDF 文件进行提问。 问题背景: I am trying to ask questions against a multiple pdf using pinecone and openAI but I dont know how to. 我正在尝试使用 Pinecone 和 OpenAI 对多个 PDF 文件进行提…

ssh远程连接服务

1、概述 一种安全访问远程服务器的协议,远程管理工具,通过加密方式管理连接,使服务器更安全。 2、加密算法 对称加密 发送密码前将密码数据加密成密文,然后发送出去 接收方收到密文后,使用同一个密钥将密文解密。…

基于爬山法MPPT和PI的直驱式永磁同步风力发电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM 4.2 MPPT 4.3 PI 控制器原理 5.完整工程文件 1.课题概述 基于爬山法最大功率点跟踪 (Maximum Power Point Tracking, MPPT) 和比例积分控制器 (Proportional Integral, PI) 的直驱式永磁同步…

《软件工程导论》(第6版)第5章 总体设计 复习笔记

第5章 总体设计 一、总体设计概念 1.定义 总体设计的基本目的就是回答“系统应该如何实现”这个问题,总体设计又称为概要设计或初步设计。 2.主要任务 (1)划分出组成系统的物理元素程序、文件、数据库、人工过程…

大模型种草书籍——BERT基础教程:Transformer大模型实战,看完头皮发麻!

《BERT基础教程:Transformer大模型实战》 是一本专注于介绍自然语言处理(NLP)领域的先进技术——BERT(Bidirectional Encoder Representations from Transformers)及其应用的教程书籍。 以下是这本书的简要介绍&#…

C++:string类(1)

1.标准库中的string类 1.1 string类(了解) string类的文档介绍在使用string类时,必须包含#include头文件以及using namespace std; 1.2 auto和范围for auto关键字 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型…

gdb 教程

文章目录 GDB启动 GDB 的方法GDB 命令工具参考 GDB GDB是Linux下的调试工具,可以调试C、C、Go、java等语言 GDB提供了以下四个功能: 程序启动时,可以按照自定义的要求运行程序,如设置参数和环境变量可以让被调试的程序在所指定…

Netflix Feign:微服务HTTP调用如何简化?

Netflix Feign:微服务HTTP调用如何简化? 1、什么是Netflix Feign?2、Feign的优点3、示例4、总结 💖The Begin💖点点关注,收藏不迷路💖 1、什么是Netflix Feign? Feign是一个声明式的…

MFC工控项目实例之十添加系统测试对话框

承接专栏《MFC工控项目实例之九选择下拉菜单主界面文本框显示菜单名》 参考前期我的博客文章《MFC3d立体按钮制作》 这里只给出相关代码 1、在SysTest.h文件中添加代码 #include "ShadeButtonST.h" #include "BtnST.h" class CSysTest : public CDialog {…

OpenAI“草莓”模型及全能型与专业型AI的思考

一、OpenAI“草莓”模型的全能性及其未来趋势 近日,OpenAI预计在秋季推出的代号为“草莓”的新AI模型,展现了其在自然语言处理(NLP)和深度学习领域的又一重大突破。该模型不仅增强了推理能力,还提供了更为人性化的互动…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一:为什么要继承 ①代码重用:继承允许我们重用、扩展或修改父类的属性和方法,而无需重…

<Rust>egui学习之小部件(四):如何在窗口中添加滚动条Scroll部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第四篇博…

【C++ Primer Plus习题】7.10

问题: 解答: #include <iostream> using namespace std;double add(double a, double b) {return a b; }double mul(double a, double b) {return a * b; }double sub(double a, double b) {return a - b; }double div(double a, double b) {return a / b; }double cal…

[LLM]:大模型(Transformer)参数量分析

1. 前言2. 模型参数量 文章内容主要摘自&#xff1a;https://zhuanlan.zhihu.com/p/624740065 1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&am…

Python编码系列—Python代码重构:提升代码质量

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…