Java文字描边效果实现

效果:

FontUtil工具类的完整代码如下:

其中实现描边效果的函数为:generateAdaptiveStrokeFontImage()

package com.ncarzone.data.contentcenter.biz.img.util;import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import sun.font.FontDesignMetrics;import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;/*** 字体处理工具类*/
public class FontUtil {public static String TTF_ZHIZUN = "ZHIZUN"; // 至尊体public static String TTF_BIAOTIHEI = "BIAOTIHEI"; // 标题黑/*** 自适应方式的文字转描边的艺术字图片* @param text 文本内容* @param fontTTFName 字体名称* @param fontWeight 字体大小* @param fontColor 字体颜色* @param isItalic 是否倾斜* @return 字体图片信息*/public static BufferedImage generateAdaptiveStrokeFontImage(String text, String fontTTFName, float fontWeight,Color fontColor, boolean isItalic){//字体加载以及设置Font font = loadFont(fontTTFName, fontWeight, isItalic);int textWidth = new Double(getWordFontWidth(font, text) * 1.06).intValue();  // 考虑倾斜的影响,稍微增加长度int textHeight = getFontHeight(font);BufferedImage bi = new BufferedImage(textWidth, textHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g2d = (Graphics2D) bi.getGraphics();// 增加下面代码使得背景透明bi = g2d.getDeviceConfiguration().createCompatibleImage(textWidth, textHeight, Transparency.TRANSLUCENT);g2d.dispose();g2d = (Graphics2D) bi.getGraphics();//消除锯齿ImageUtil.antialiasing(g2d);FontRenderContext frc = g2d.getFontRenderContext();TextLayout tl = new TextLayout(text, font, frc);Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(0,fontWeight));g2d.setStroke(new BasicStroke((float)(fontWeight * 0.1)));g2d.setColor(Color.BLACK);g2d.draw(sha);g2d.setColor(fontColor);g2d.fill(sha);g2d.dispose();return bi;}/*** 加载字体* @param fontTTFName 字体名称* @param fontWeight 字体大小* @param isItalic 字体是否倾斜* @return*/public static Font loadFont(String fontTTFName, float fontWeight, boolean isItalic){//字体加载以及设置Font font = null;try {Resource fontResource = new ClassPathResource("fonts/" + fontTTFName + ".TTF");InputStream inputStream = fontResource.getInputStream();Font f = Font.createFont(Font.TRUETYPE_FONT, inputStream);if( isItalic ){font = f.deriveFont(Font.PLAIN, fontWeight).deriveFont(AffineTransform.getShearInstance(-0.18, 0));}else{font = f.deriveFont(Font.PLAIN, fontWeight);}}catch (IOException | FontFormatException e){e.printStackTrace();}return font;}/*** 计算文字占用的字体宽度总和* @param font   字体* @param content 文字* @return*/public static int getWordFontWidth(Font font, String content){FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);int width = 0;for( int i = 0; i < content.length(); i++ ){width += metrics.charWidth(content.charAt(i));}return width;}/*** 获取字体的高度* @param font* @return*/public static int getFontHeight(Font font){FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);int height = metrics.getHeight();return height;}
}

消除锯齿函数的代码如下:

// 消除锯齿public static void antialiasing(Graphics2D g2d){g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);}

测试代码如下:

BufferedImage bi = FontUtil.generateAdaptiveStrokeFontImage("中秋节快乐", "BIAOTIHEI", 300, Color.WHITE, true);
ImageUtil.storeImg2LocalStorage(bi, "font", 3);

其中保存测试图片的代码为:

// 保存图片到本地public static void storeImg2LocalStorage(BufferedImage bi, String name, int i){try{ImageIO.write(bi, "png", new File("D:\\temp\\image\\output\\" + name + i + ".png"));}catch (IOException e){e.printStackTrace();}}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prompt-To-Prompt——仅通过文本进行图像编辑

文章目录 1.摘要2.算法2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-attentionWord SwapAdding a New PhraseAttention Re–weighting 3.应用Text-Only Localized EditingGlobal editingFader Control using Attention Re-weightingRea…

HPC集群自动弹性扩缩的两种实现方式

常青藤 HPC常青园 2023-07-28 19:48 发表于北京 弹性扩缩技术正在成为HPC集群中的一项重要技术。它可以根据实际需求动态调整集群资源&#xff0c;应对用户负载的波动。对于运维团队来说&#xff0c;自动弹性扩缩能够减轻集群运维负担&#xff0c;提高集群资源利用率&#xff0…

Kettle REST Client获取token调用接口解析JSON入文件实例

Kettle REST Client获取token调用接口解析JSON入文件实例 需求说明 通过kettle组件调用接口并解析JSON成结构化数据入文件。 完整实例 解决方法 利用生成记录组件定义URL参数通过REST ClENT组件请求得到TOKEN通过JSON INPUT组件解析接口请求的结果通过JAVASCRIPT组件拼接生…

储存高精长整型の另一种思路——二维数组

利用二维数组储存高精长整型 题目解题思路问题解决代码实现总结反思 题目 luogu P2437 蜜蜂路线 解题思路 最初只觉得是一道很简单的递推 先考虑从第一个点出发的情况&#xff0c;对于第 k ( k ≥ 3 ) k (k≥3) k(k≥3)个点&#xff0c;路线数表示如下&#xff1a; a [ k …

【二叉搜索树】将有序数组转换为二叉搜索树-力扣 108 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

人工智能AI 全栈体系(四)

第一章 神经网络是如何实现的 除了全连接神经网络外&#xff0c;还有其他形式的神经网络。 此节将讲述神经网络的另一种形式&#xff1a;卷积神经网络。 四、卷积神经网络 首先我们看看全连接神经网络有什么不足。正如其名字一样&#xff0c;全连接神经网络&#xff0c;两个…

vscode json 无决找到“e:\...“

在上一章中提到了解决 无法使用 compilerPath 的问题&#xff0c;该问题明显是相对路径配置错误。 但是解决该问题后&#xff0c;发现输出了新的问题: 由该输出可知&#xff0c;在 e:\gitsource\ODrive-fw-v0.5.1\Firmware\ 路径下未找到 D:\gcc-arm-none-eabi-10.3-2021.10…

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字&#xff1a; Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

Postman应用——接口请求(Get和Post请求)

文章目录 新增请求Get请求Post请求 这里只讲用的比较多的Get和Post请求方式&#xff0c;也可以遵循restful api接口规范&#xff0c;使用其他请求方式。 GET&#xff08;SELECT&#xff09;&#xff1a;从服务器取出资源&#xff08;一项或多项&#xff09;POST&#xff08;CR…

控制台日志打印console的封装,加入美化与打印开关

控制台日志打印console的封装&#xff0c;加入美化与打印开关 为什么要写这个&#xff1f; 封装这个控制台日志打印工具&#xff0c;主要是在项目中自己做的SDK需要提供给其他开发人员使用&#xff0c;加入了日志美化和打印打开&#xff0c;方便了开发人员查找SDK中的日志&am…

目标检测前言,RCNN,Fast RCNN,Faster RCNN

一、RCNN&#xff1a; 找到概率最高的目标之后&#xff0c;与其他目标进行IOU交并比计算&#xff0c;若高于一定值&#xff0c;则说明这两张图片预测的是同一个目标&#xff0c;则把概率低的目标删掉 二、Fast RCNN 因为是直接得到特征图之后进行映射&#xff0c;所以不限制输入…

uniapp抽取组件绑定事件中箭头函数含花括号无法解析

版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7"... 箭头函数后含有花括号的时候, getData就拿不到val参数 , 解决办法就是去除花括号 // 错误代码: <SearchComp change"(val) > { getData({ val …