/*** 艺术字图片生成工具* @author visy.wang* @date 2021/12/8 10:31*/
public class ImageUtil {private static final String FONT_FILE_PATH = "font/FZXBS_GBK.TTF"; //字体文件路径private static final float FONT_SIZE = 140f; //字号private static final java.awt.Color COLOR = java.awt.Color.RED; //颜色private static Font fontPlain; //正常字体private static Font fontBold; //加粗字体public static Boolean enableTest = false; //测试启用开关static {try{//字体加载以及设置Resource fontResource = new ClassPathResource(FONT_FILE_PATH);InputStream inputStream = fontResource.getInputStream();Font f = Font.createFont(Font.TRUETYPE_FONT, inputStream);fontPlain = f.deriveFont(Font.PLAIN, FONT_SIZE);Map<TextAttribute, Object> attrs = new HashMap<>();attrs.put(TextAttribute.SIZE, FONT_SIZE);attrs.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_DEMIBOLD);fontBold = f.deriveFont(attrs);}catch (IOException | FontFormatException e){e.printStackTrace();}}/*** 文字转艺术字图片* @param text 文本内容* @param width 宽度* @param width 高度* @param padding 两端间隔* @param isBold 是否加粗* @return 图片*/public static BufferedImage toImage(String text, int width, int height, int padding, Boolean isBold) {int wordWidth = (width-padding*2) / text.length();Font font = isBold ? fontBold : fontPlain;// 生成图片BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);Graphics2D g2d = bufferedImage.createGraphics();// 白色背景g2d.setColor(java.awt.Color.white);// 填充矩形g2d.fillRect(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight());//消除锯齿antialiasing(g2d);char[] chars = text.toCharArray();for (int i = 0; i < chars.length; i++) {String ch = String.valueOf(chars[i]);BufferedImage bi = textToImage(ch, font, wordWidth, height , i);//测试printWord(bi, "afterResizeImage", i);g2d.drawImage(bi, i * bi.getWidth()+padding, -bi.getHeight() / 12, bi.getWidth(), bi.getHeight(), null);}g2d.dispose();return cutout(bufferedImage);}/*** 文字转图片* @param string 文字* @param font 字体* @param wordWidth 单个文字宽度* @param height 高度*/private static BufferedImage textToImage(String string, Font font, int wordWidth, int height, int i){BufferedImage bufferedImage = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);Graphics2D tempG2 = (Graphics2D) bufferedImage.getGraphics();Rectangle2D r2d = font.getStringBounds(string, tempG2.getFontRenderContext());// 生成文字大小的ARGB图片,纠正部分艺术字高度测量误差BufferedImage bi = new BufferedImage((int) r2d.getWidth(), (int) (r2d.getHeight()/5*6), BufferedImage.TYPE_INT_ARGB);Graphics2D g2d = (Graphics2D) bi.getGraphics();bi = g2d.getDeviceConfiguration().createCompatibleImage(bi.getWidth(), bi.getHeight(), Transparency.TRANSLUCENT);g2d.dispose();g2d = (Graphics2D) bi.getGraphics();g2d.setFont(font);g2d.setColor(COLOR);g2d.setBackground(java.awt.Color.WHITE);//消除锯齿antialiasing(g2d);g2d.drawString(string, 0, font.getSize() - 1);g2d.dispose();//测试printWord(bi, "afterTextToImage", i);bi = resizeImage(bi, wordWidth, height);return bi;}/*** 重置图片大小* @param oldImage 原图* @param w 新宽度* @param h 新高度* @return 新图片*/private static BufferedImage resizeImage( BufferedImage oldImage, int w, int h) {BufferedImage newImage = new BufferedImage(w, h, oldImage.getType());Graphics2D g2d = newImage.createGraphics();//消除锯齿antialiasing(g2d);g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.drawImage(oldImage, 0, 0, w, h, null);g2d.dispose();return newImage;}/*** 去掉背景色* @param bi 原图片* @return 去掉背景色的图片*/private static BufferedImage cutout(BufferedImage bi) {BufferedImage image = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());Graphics2D g2d = image.createGraphics();//消除锯齿antialiasing(g2d);g2d.drawImage(bi, 0, 0, null);g2d.dispose();int width = image.getWidth();int height = image.getHeight();DirectColorModel dcm = (DirectColorModel) ColorModel.getRGBdefault();for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {int rgb = image.getRGB(x, y);int red = dcm.getRed(rgb);int green = dcm.getGreen(rgb);int blue = dcm.getBlue(rgb);int alp = dcm.getAlpha(rgb);if (red == 0 && blue == 0 && green == 0) {// 如果像素为黑,则让它透明alp = 0;rgb = alp << 24 | 0 << 16 | 0 << 8 | 0;// 进行标准ARGB输出以实现图象过滤image.setRGB(x, y, rgb);}if (red == 255 && blue == 255 && green == 255) {// 如果像素为白色,则让它透明alp = 0;rgb = alp << 24 | 0 << 16 | 0 << 8 | 0;// 进行标准ARGB输出以实现图象过滤image.setRGB(x, y, rgb);}}}return image;}//消除锯齿private 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);}//测试用private static void printWord(BufferedImage bi, String name, int i){if(!enableTest){return;}try{ImageIO.write(bi, "png", new File("D:\\test\\words\\"+name+i+".png"));}catch (IOException e){e.printStackTrace();}}}

Java艺术字图片生成相关推荐

  1. Java根据图片生成GIF动图

    昨天看到手机QQ空间可以预览自己手机上的图片并生成GIF图片,然后看到微信的公众号上很多都是动图,于是就想用java将几张图片生成gif图. 合成gif的图片大小最好一致,不要问我为什么. 具体代码如 ...

  2. Java毕业设计-图片生成MP4格式视频

    需求? 因为项目需求,需要使用Java将数张图片合成mp4视频并播放,在网上查了很多,发现关于这方面的很少,还有一些比较麻烦的,最后找的这个比较简单容易实现的,合成短视频实际使用了,给视频添加音频并没 ...

  3. java lowpoly低多边形风格图片生成

    lowpoly风格的图片生成,java实现. 闲着没事干刷知乎,刷到这样一个问题http://www.zhihu.com/question/29856775 看看觉得还是挺好看的,那么,我也想提高b格 ...

  4. 小程序画布功能+JAVA用KUMO生成词云图片

    小程序画布功能+JAVA用KUMO生成词云图片 KUMO git地址:https://github.com/kennycason/kumo 原理:利用Kumo生成词云,并转换成64位传到小程序,小程序 ...

  5. java实现pdf生成,包括合并图片

    参考帖子: 这位大佬的帖子必读,因为涉及到pdf创建表单的教程: java使用itext填充pdf模板,超简单教学,有手就行 以下是学习当中参考的帖子: java pdf域插入img_java实现在p ...

  6. java关于Zxing 生成带Logo 二维码图片失真问题

    java关于Zxing 生成带Logo 二维码图片失真问题 问题点 logo本身是高清图片,但是Zxing生成的二维码中,logo像素失真,感觉被严重压缩一样. 排查问题 是Graphics2D 绘制 ...

  7. Java | 将文字生成在空白图片居中位置(根据图片大小,自动调节文字大小)

    Java | 将文字生成在空白图片居中位置(根据图片大小,自动调节文字大小) 话不多说,直接上代码.(大家可以自己根据需要设置图片大小,不过图片过小时,字体会变模糊,尽量设置图片大一点,600~100 ...

  8. Java生成png文件字体不清晰,java操作字体生成png图片,该怎么解决

    java操作字体生成png图片 java生成png图片,前提不能固定图片大小,根据文字和文字字号 自动生成png图片. 网上找了一些方法都是需要固定图片大小然后生成图片的.有没有办法解决自动生成文字p ...

  9. Java利用poi生成word(包含插入图片,动态表格,行合并)

    Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...

最新文章

  1. 关于学习Python的一点学习总结(27->关键字参数和默认值)
  2. C++中的四类强制转换?
  3. Linux操作系统下如何利用SSH进行远程控制
  4. 大白话5分钟带你走进人工智能-第十节梯度下降之归一化的各种方式和必要性(5)...
  5. ArcGIS空间分析要点学习
  6. python leetcode_Leetcode 常用算法 Python 模板
  7. table表头固定4种方法_移动式、半移动式、半固定式、固定式4种破碎站详细介绍及优缺点对比...
  8. 面向对象编程(六):数据封装
  9. Python狼人之夜--文字冒险游戏
  10. arm linux驱动 知乎_引导 ARM Linux
  11. MS08067 Web安全进阶实战班-第一期 强势来袭~
  12. 注册表禁用计算机管理,注册表被管理员禁用如何处理 怎么解决注册表被管理员禁用【图文】...
  13. 量子计算机的工作原理(转)
  14. SAP国际商品编码(EAN码)允许前导0增强
  15. 服务器里的文件怎么删除
  16. OpenCV实现SfM(四):Bundle Adjustment
  17. python 爬取歌曲程序_如何让程序像人一样的去批量下载歌曲?Python爬取付费歌曲...
  18. php对接支付宝当面付接口视频教程,支付宝当面付接口demo(面对面扫码支付)
  19. (完整版)英语常用词组大全(2000词以上)
  20. 计算机命令vty是什么意思,华为交换机基础命令中user interface 0和user-interface vty 0的区别...

热门文章

  1. vue移动端页面调用手机拍照_vue实现PC端调用摄像头拍照、移动端调用手机前置摄像头人脸录入、及图片旋转矫正、压缩上传base64格式/文件格式...
  2. Spring-初识Spring框架-IOC控制反转(DI依赖注入)
  3. Chrome 谷歌分页打印 去除页眉页脚 点击取消或打印关闭当前窗口
  4. 小米路由器3无线网连接到服务器,192.168.31.1小米路由器手机登录设置方法
  5. 微信公众号开发使用测试号不能测试支付接口的解决方案
  6. Oracle ASMM和AMM
  7. 知识问答(KBQA)两种主流方法:基于语义解析和基于信息检索的方法介绍
  8. js 根据中文获取拼音首字母
  9. html给input添加边框,html input怎么设置虚线边框样式
  10. 目标检测的Tricks | 【Trick13】使用kmeans与遗传算法聚类anchor