在X11位图字体中显示字符串

3
我该如何在古老的X11位图字体中呈现一个字符串?我的意思是类似于:
-*-lucida-medium-r-normal-*-34-*-*-*-*-*-*-*

我可以使用xfontsel来找到需要的字体。但我需要一个命令行工具来显示特定字体中的字符串。类似的TrueType字体无法使用,因为它必须是像素完美的(我正在尝试获取该字体中每个字母的图像以进行OCR)。

4个回答

3

我不确定是否有命令行工具。但是您可以使用Xlib和C自己编写。

似乎有人编写了一个简单的X11 C程序,使用Xlib显示字符串。更改几行并使用以下方式编译:

gcc -lX11 -o xrenderstring xrenderstring.c

..应该对你有用。

我已经复制了整个程序在这个gist中(以防它从原始来源消失),修改为接受两个参数:1.字体名称,2.要呈现的字符串。

所以你会像这样调用它(当然,在编译之后):

./xrenderstring "-*-lucida-medium-r-normal-*-34-*-*-*-*-*-*-*" "Quick brown fox"

1
很好,谢谢!如果可以的话,我通常会尽量避免使用原始的Xlib编码 :-). - jdm

2

仅渲染使用该字体的字符:

  • xfd -fn '-*-lucida-medium-r-normal-*-34-*-*-*-*-*-*-*'
  • xfontsel -pattern '-*-lucida-medium-r-normal-*-34-*-*-*-*-*-*-*'

渲染特定字符串:

  • xfontsel -pattern '-*-lucida-medium-r-normal-*-34-*-*-*-*-*-*-*' -sample 'The quick brown fox jumps the shark'

1
发现了一个巧妙的方法。将以下内容添加到~/.Xdefaults文件中:
xedit*editWindow*font: -*-lucida-medium-r-normal-*-36-*-*-*-*-*-*-*

然后运行

$ xrdb -merge ~/.Xdefaults
$ xedit

然后我输入了字符串,截了一张屏幕截图,并在GIMP中进行了比较。

(结果发现X11字体并不完全正确。我的来源使用的是Lucida Sans 36 pt(ttf),但没有抗锯齿和可能有奇怪的提示。)


1
你可以使用ImageMagick。
附加好处:
- 可以呈现旧式(固定)或TTF或其他字体 - 可以呈现到屏幕或图像文件(PNG等)
简单方法:
对于短文本。
echo "The quick brown fox jumps over the lazy dog." \
| convert \
-font '-*-fixed-*-*-*-*-18-*-*-*-*-*-iso8859-*' \
TEXT:- -trim fox.png

将内容渲染到屏幕上:
echo "The quick brown fox jumps over the lazy dog." \
| convert \
-font '-*-fixed-*-*-*-*-18-*-*-*-*-*-iso8859-*' \
TEXT:- -trim MIFF:- | display MIFF:-

删除 -trim 以查看 ImageMagick 使用画布进行绘制。

更多控制

  • 画布大小。为了避免两步计算,创建比所需更大的画布,之后再修剪。
  • 控制背景和前景颜色。
  • 控制 PNG 参数(每像素一位)。
convert -size 2000x20 xc:black \
-font '-*-fixed-*-*-*-*-18-*-*-*-*-*-iso8859-*' \
-fill white \
-draw "text 0,15 'The quick brown fox jumps over the lazy dog.'" \
-trim +dither -depth 1 fox.png

下面生成的图像大小为592字节:

Sentence rendered with X11 font 'fixed'.

获取独立框架字符(供后续组合使用)

您可以在上面的一行中放置一个字符,但是对多个字符进行独立应用会导致生成的图像大小和公共基线不再相同。

for CHAR in H e l o ' ' W r d
do
convert -size 9x13 xc:black \
-font '-*-fixed-*-*-*-*-18-*-*-*-*-*-iso8859-*' \
-fill white -stroke none \
-draw "text 0,10 '${CHAR}'" \
+dither -depth 2 fixed_char_${CHAR}.png
done

下面的命令会生成一个PNG图片,显示单独帧的图像保持它们的公共对齐方式:
montage -mode concatenate -tile x1 fixed_char_H.png fixed_char_e.png \
fixed_char_l.png fixed_char_l.png fixed_char_o.png fixed_char_\ .png \
fixed_char_W.png fixed_char_o.png fixed_char_r.png fixed_char_l.png \
fixed_char_d.png helloworld.png

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接