Java Font 居中 和 抗锯齿下效果

居中

看到网上经常有这样的一些头像,是纯色加上第一个文字,类似于这样子的:
我们也想自己做一套,考虑到有很多端都要用,因此选择在服务端实现这样的头像。开发语言是Java。
在java里面往图片里面写一段文字一般采用 Graphic类的drawString方法,看下drawString方法的介绍:
链接: https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawString(java.lang.String,%20int,%20int)
public abstract void drawString(String str,int x,int y)
Draws the text given by the specified string, using this graphics context's current font and color. The baseline of the leftmost character is at position (xy) in this graphics context's coordinate system.
显然此处的str字段只需要写一个字符的即可。x和y表示的是起始的位置,在这儿和图像的不大一样,指的是右下角的位置。
根据要求我要生成的图片大小是216*216的,字体大小是136px。 对于ASCII码表上面的字母、字符和数字,通常宽度都是为汉字的一半,因此在调用的时候要注意好起始点的间距。拿汉字来举例的话,应该文字是处在 (40,40)到 (176,176)的正方形里面。因此此处的x和y我填写的是40和176.
看下生成的图片:
绿色的线表示的就是(40,40)到(176,176)的正方形。可以看到在x轴上面是居中的,但是在y轴上却明显地偏下方。那么到底偏了多少,怎么补偿呢?不能瞎算,此处肯定跟字体是有关系的!搜索没得要领(估计是自己没找对关键字),然后幸好手头有本《Java核心技术 卷1:基础知识》,看了看里面字体的一节,解答了我的疑惑。
其实在这个类的说明里面指出了一些线索,不过刚接触的时候很难知道有这个类:
FontMetrics   里面有段话是这样的:
When an application asks to place a character at the position (x, y), the character is placed so that its reference point (shown as the dot in the accompanying image) is put at that position. The reference point specifies a horizontal line called the baseline of the character. In normal printing, the baselines of characters should align。
意思是,我们设置x和y的时候实际上设置的是参考点的位置,参考点就是上面的那个点。参考点所在的水平线是 baseline 基线,最上面的线是坡顶(ascenter),, 最下面的线是坡底(descenter)。坡顶到基线的距离是 上坡度(ascent), 坡底到基线的距离是下坡度。
再看一下Baseline的wikipedia,有这样的一幅图也很形象:
那么知道字体的上坡度和字体的下坡度是否能够解决问题了?试一下!
(1) 怎么知道下坡度? 下坡度可以用LineMetrics的 getDescend()方法解决。
(2)怎么知道上坡度?在书上上坡度有点恶心,需要这样子做: 
        FontRenderContext context = g2.getFontRenderContext(); Rectangle2D bounds = f.getStringBounds(str, context);double ascend = -bounds.getY();
 但实际上用LineMetrics的getAscend() 方法就可以了。
(3)计算下x,y的位置, 对于水平方向的位置,很简单:

                double x = (bufferedImage.getWidth() - 136) /2;
      对于垂直方向上的位置,两边留空白是: height - (ascend + descend)/ 2;
      注意字的位置不是左上角算起的,因此套住字的左下角的框框是: height - 上面的式子 = (height + ascend + descend) / 2;
      再注意,x,y指的是baseline的,因此还需要减去一个descend的距离,因此最终应该是 height + ascend - descend的距离。
看看生成的结果:

已经很赞了!
但是下面几个点还需要仔细探索下:
字体的size 指的是 point size, (猜测)意思应该是字体的占的像素点的数量,但是这个指的是高度还是宽度?
从高度来看:“回”字的ascend是 126.4375, descend是:9.5625, 加起来正好是136。 这样看来是高度啦。那么实际上应该也不需要求字体的ascend了, 只需要
y = (height + 136)/ 2 - descend就可以了!

抗锯齿效果
前面的“回”字都是横竖笔画,来个斜的笔画的:
可以看到在撇捺的地方很毛糙影响美观。这是因为没有开启抗锯齿模式。抗锯齿模式会对上面的部分进行计算和优化减少毛边。
实现起来简单调用下就行了: 
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

现在看下结果:

差别还是很明显的!

Java Font 居中 反锯齿效果相关推荐

  1. 3DMark将加入DLSS 测试人工智能强化反锯齿效果

    2019独角兽企业重金招聘Python工程师标准>>> 3DMark是由UL公司推出的显示效能测试软件,其中的Port Royal项目在先前已加入光线追踪测试功能,如今又新增支持DL ...

  2. 关于 AlphaBlend 和 32bpp 的反锯齿图标

    原文地址::http://www.haogongju.net/art/840107 相关网帖 1.DirectDraw版的AlphaBlend----http://www.haogongju.net/ ...

  3. linux netbeans 中文乱码,浅谈Linux Netbeans字体反锯齿处理

    用的Linux发行版是Ubuntu8.04,如果使用源里面的JDK一切都很简单(现在源里的版本是1.6u6),JDK6开始支持反锯齿.装完Netbeans你就会惊喜的发现,仿原生GUI的界面(GTK+ ...

  4. (转)完美画质 3D游戏反锯齿技术浅析 .

    完美的画面已经离我们不再遥远--反锯齿技术浅析 不管现今的游戏画面有多完美,人物和环境有多真实,但游戏画面的构成的主要方式仍然没有得到改善:一帧画面由成千上万像素构成.这意味着物体多边形的轮廓最终是锯 ...

  5. Ubuntu 8.04下Netbeans的字体反锯齿解决(转)

    原帖地址:http://www.oklinux.cn/html/Basic/jyjq/20081011/62034.html 测试可用,网上搜的其他方法如复制字体文件等都不成功. 首先说明,我是被锯齿 ...

  6. threejs 反锯齿,raser,特效发光

    反锯齿 反锯齿本来是在threejs中比较容易的,加上{ antialias: true,alpha :true} 以后确实效果好很多,但是问题是很多都是要用后期处理来做这个场景,而懂得opengl的 ...

  7. html5 canvas消除锯齿,HTML5 Canvas 如何取消反锯齿绘图

    一.问题的提出 我们都知道反锯齿(anti-aliasing)绘图给我们带来更好的视觉体验,有了这个技术,绘制的图形的边缘再不是以前毛毛躁躁的样子了.这就是采用反锯齿算法的功劳.其实质就是把要绘制的颜 ...

  8. html5 canvas消除锯齿,HTML5 Canvas 如何取消反锯齿绘图

    原文出自:http://blog.csdn.net/cheungmine/article/details/7053455 一.问题的提出 我们都知道反锯齿(anti-aliasing)绘图给我们带来更 ...

  9. renderScript实现图片反色效果实例

    下面通过一个例子深入了解renderScript的工作过程: 用renderScript实现图片的反色效果: 反色效果又叫底片效果,首先要知道什么是反色: 反色又叫补色,红的补色是绿色,蓝的补色是橙色 ...

最新文章

  1. 创建新的ros工作空间
  2. JAVA《第一次作业》
  3. 大量网课视频学习方法升级版!生命就是一往无前和永无止境的直播!
  4. DEV控件中GridView中的复选框与CheckBox实现联动的全选功能
  5. 做数学与拼乐高的若干相似之处
  6. centos 7.2 安装php56-xml
  7. 斯特林数-斯特林反演
  8. 网页设计中一些小功能
  9. HDU2837 Calculation(指数循环节)题解
  10. xmpp java_XMPP: Android基于Xmpp的即时通讯
  11. Unity—英雄无敌(前方高能)
  12. NoSQLBooster for MongoDB 5x版本商业版(mac os)
  13. 三位如花女人的多彩理财生活
  14. 一升的眼泪剧情和图片(转贴)
  15. 正则表达式与遇到的问题
  16. 客运售票员_见过这样的客运售票员吗
  17. 移芯平台EC616上按键唤醒
  18. 安装spconv踩的坑
  19. 1111112222
  20. 解决连接数据库Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错问题

热门文章

  1. 中国医疗美容行业深度调研分析及投资战略咨询报告2021-2027年
  2. Android 禁止应用截屏和录屏
  3. Android:从简历到offer直通车,跳槽大厂必备宝典,android开发环境页面设计
  4. 怎么把cad文件转化为图片?
  5. 华科大考研计算机系834大纲之计算机网络(三)
  6. Vue2 应用测试学习 02 - TDD 案例(案例介绍和创建、编写测试用例)
  7. poj 3348 凸包
  8. 爱普生Epson BA-T500 打印机驱动
  9. wordpress插件_适用于WordPress的10个最佳联盟营销工具和插件
  10. Channel基本介绍