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. 怎么调用获取被创建的预制体_Uber 开源 Plato:扩展性极强的开发测试会话 AI 平台,可实现多智能体并行训练...
  2. Android中与Intent相关的还有,Android中Intent的相关用法
  3. 四种代码洁癖类型,程序员看了直呼内行(文末经典书送)
  4. c语言计算多个整数加减,求用C编个大数加减法运算程序
  5. fcn从头开始_从头开始有营销问题
  6. Array为什么这样会有错?
  7. 2022 软件测试工程师面试题小结【附带答案】
  8. Struts2的属性驱动与模型驱动的区别
  9. 酷狗音乐网站前端JS的逆向过程
  10. 2022年中国物联网行业研究报告丨附下载
  11. android 4.4新功能介绍(Kitkat)
  12. 苹果系统如何添加服务器的打印机,哪位清楚macbookair如何添加打印机
  13. 关于目前CIM(BIM+GIS)行业的一些看法
  14. 环境猫室内监测仪——您的空气智能管家
  15. 【Android -- 职场】六个职场意识
  16. WPF 触摸屏小键盘样式
  17. 华为手机进入工程模式
  18. 每日新闻 | 2018年全球十大IaaS服务商:中国占四席 阿里云第三
  19. Desktop Central 应用规范报告—如何利用BYOD(一)
  20. windows下frp socket内网穿透体验

热门文章

  1. 人生莫大的悲哀,不是穷,而是穷忙
  2. 办公系统审批流转 java开发_javaweb 公文流转系统制作
  3. jpa双向多对多关系
  4. 图论专题-学习笔记:虚树
  5. Hadoop的十大应用场景?
  6. pandas按若干个列的组合条件筛选数据
  7. 银行应将低代码能力作为在评估厂商综合能力的一个维度
  8. 中国铁路规定,计价里程按里程区间阶梯状计价
  9. 如何制作一个低成本投入,多功能营销的企业网站
  10. bzoj 3877: [Ahoi2014]保龄球