以X11位图字体渲染字符串

时间:2012-07-27 10:27:02

标签: linux fonts x11

如何使用古老的X11位图字体渲染字符串?我的意思是

-*-lucida-medium-r-normal-*-34-*-*-*-*-*-*-*

我可以找到xfontsel。我只需要一个命令行工具等,以该字体显示给定的字符串。类似的TrueType字体不起作用,因为它必须是像素完美的(我试图将每个字母的图像以OCR形式呈现为该字体的图像)。

4 个答案:

答案 0 :(得分:3)

我不确定是否有命令行工具。但是你可以随时使用Xlib和C。

有人似乎写了a simple X11 C program,它使用Xlib显示一个字符串。更改几行并编译:

gcc -lX11 -o xrenderstring xrenderstring.c

..应该为你做。

我已经复制了整个程序in this gist(如果它从原始源中消失),修改为带有两个参数:1。fontname,2。要渲染的字符串。

所以你称之为(在编译之后):

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

答案 1 :(得分: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'

答案 2 :(得分:1)

发现了一种hackish方式。将以下内容添加到〜/ .Xdefaults:

xedit*editWindow*font: -*-lucida-medium-r-normal-*-36-*-*-*-*-*-*-*

然后运行

$ xrdb -merge ~/.Xdefaults
$ xedit

然后我输入了字符串,截取屏幕截图,并将其与gimp进行比较。

(事实证明,X11字体毕竟不是正确的。我的来源使用了Lucida Sans 36 pt(ttf),但没有抗锯齿,可能还有一些奇怪的暗示。)

答案 3 :(得分:0)

您可以使用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,该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