IE盒子

搜索
查看: 101|回复: 1

Java 文字对齐的研究?

[复制链接]

5

主题

9

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-9-22 07:59:18 | 显示全部楼层 |阅读模式
背景

由于平时有比较多的照片需要添加水印,如果一次外拍回来筛选出 20 张,使用 Photoshop 给这 20 张一张一张添加水印的话,略显麻烦,在 Photoshop 里面有“动作”和“自动化脚本”的方式或许可以实现。但我的需求不仅仅是添加水印,我的需求是:批量自动根据图片是横图还是竖图来缩放图片 + 添加不等宽的纯白色边框 + 添加个人图片签名(.png) + 一段对照片描述的文字。所以 ,Photoshop 的“动作”就比较吃力。

  • 尝试过使用 Photoshop 的自动化脚本来处理,找了 Photoshop 的 jsx 脚本文档,和编程工具,但 Adobe 似乎已放弃对 jsx 的编程维护,编程工具多年未更新,如果纯记事本写代码效率太低还要去查找文档(本身对 jsx 的文档不熟悉),放弃。
  • 提到自动化工具,肯定不会想不到 Python(丰富简单方便的各种库,拿来就用...),于是也尝试使用 Python 来写,之前没使用过图像处理的相关库,研究了下选取了 OpenCV 这个出名的图像处理库,一用直接傻眼了,对图片的缩放画质损失严重,尝试使用了不同的插值算法,但还是效果不加,放弃。
Photoshop 和 Python 这两条路被堵死,那就换别的语言吧...打算用熟悉的 Java,但一直没用过 Java 的图像处理相关功能,最多是大学的时候写过一点点简单的界面,Java 就不是干这事的。
问题

写了 500 字好像和标题没关系?Java 平时在用熟练,缩放图片、添加白色边框、添加图片签名、添加描述文字,一切都 OK(在 Google 老师的帮助下,毕竟很多图像处理的 API 不熟悉),最重要的一点缩放图片的质量也很好。但是...图片水印和加的那行文字居中对齐,整了半天发现死活对不齐。
探索

为啥对不齐??
查看 Java 的 API 文档,原来 Java 对文字的绘制不同于普通的图形绘制,有自己的标准(其实字体排印学中对文字的处理有个标准,可以查看 wiki:基线),文字空间有三个属性分别是 Ascent、Descent 和 Leading,还有一个隐形的 baseline ,这个 baseline 就是文字绘制的起始基线,绘制的文字会有一部分高于 baseline,也有一部分会低于 baseline。

  • Ascent 是 baseline到文字顶部空间的距离(The ascent is the amount by which the character ascends above the baseline.),实际上,文字实际绘制的像素并不会到达 Ascent,即绘制的像素离 Ascent 还有一小段空白空间
  • Descent 是 baseline 到文字底部空间的距离(The descent is the amount by which the character descends below the baseline.),实际上,文字实际绘制的像素并不会到达 Descent ,即绘制的像素离 Descent 还有一小段空白空间
  • Leading 是 Descent 到下一行文字之间保留的空间(The standard leading, or interline spacing, is the logical amount of space to be reserved between the descent of one line of text and the ascent of the next line. )






除此之外还有另外一个隐形的变量,就是 height,和 baseline,Ascent ,Descent ,Leading 之间的关系是:height = Leading  + Ascent +Descent 。
那么假设 logo 图片的中心点的纵轴坐标是 Y,那么文字绘制开始的纵坐标,即  baseline = Y + (height / 2 - Leading - Descent),这样即可让 logo 图片和文字在纵坐标上居中对齐,如图:


但这个方案还是有点问题,上文对 Ascent 和 Descent 的解释中提到“绘制的像素离 Ascent 还有一小段空白空间”,这个空白是没办法计算的,笔者在使用微软雅黑字体的时候就发现这个空白空间影响很大,如图


更好的方案

挖坑,明天补(咯咯咯)

<hr/>参考

  • FontMetrics (Java Platform SE 7 )
回复

使用道具 举报

3

主题

7

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2025-4-9 11:03:25 | 显示全部楼层
呵呵,低调,低调!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表