我正在寻找比FEN能够生成PDF,Postscript,Windows图元文件或其他看起来更好的1200x1200 dpi或更高质量的高质量图表的软件。我以为各种国际象棋引擎都可以做到,但是它们的图表都是位图(据我所知),并且在任意调整大小时看起来像垃圾。而且,他们自己的发布导出内容无法以任何标准AFAICT进行编辑。
愿意付钱。
我正在寻找比FEN能够生成PDF,Postscript,Windows图元文件或其他看起来更好的1200x1200 dpi或更高质量的高质量图表的软件。我以为各种国际象棋引擎都可以做到,但是它们的图表都是位图(据我所知),并且在任意调整大小时看起来像垃圾。而且,他们自己的发布导出内容无法以任何标准AFAICT进行编辑。
愿意付钱。
Answers:
正如thb所指出的,您需要向量。我建议您使用python-chess生成SVG矢量图像。
pip install python-chess[uci,gaviota]
由于您可能需要生成多个SVG,因此让我们创建一个脚本。因此,您可以使用脚本轻松生成多个国际象棋棋盘。以下是用Python 3.x编写的。创建一个Python脚本,例如FENtoSVG.py。插入以下代码:
import chess, sys
from chess import svg
'''
This imports python-chess module and sys module.
Python-chess will generate the boards while sys.argv will take
arguments for your script.
'''
svgstomake = (list(sys.argv))[1:]
for svgs in svgstomake:
board = chess.Board(svgs)
nameoffile = svgs.replace("/", "")+".SVG"
boardsvg = chess.svg.board(board = board)
filetowriteto = open(nameoffile, "w")
filetowriteto.write(boardsvg)
filetowriteto.close()
如果您使用的是Linux,请使用启动脚本#!/usr/bin/env python3
。
现在,如果您了解python,这是一个非常简单的脚本,但是我想对不编写代码的人保持简单。要使用脚本,请打开保存脚本的CMD / Terminal。然后,使用如下:
./FENtoSVG.py "examplefen" "morefen"
假设我要给FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"
和两个SVG "8/8/8/8/4Q3/8/8/8 w - - 0 1"
,请输入:
./FENtoSVG.py "8/8/8/8/4N3/8/8/8 w - - 0 1" "8/8/8/8/4Q3/8/8/8 w - - 0 1"
这将创建两个文件:88884N3888 w - - 0 1.SVG
和88884Q3888 w - - 0 1.SVG
我建议使用python-chess,因为可以使用内置函数轻松地对图进行自定义。它也有据可查。
一个矢量格式配不配。
如您所知,矢量格式不是将图形表示为位图,而是将图形表示为数学描述,并且可以按任意比例绘制图形。
对于Web显示,可以使用SVG格式。这是一些SVG格式的西洋棋棋子。(如果您点击链接,对于每个国际象棋棋子,请单击以访问“原始文件(SVG文件)。”直到单击此链接,您所得到的只是与SVG的位图,PNG近似值。您需要真实的SVG。)
对于PDF显示,TeX有几个可以使用的软件包。这是清单。(这仅在您熟悉TeX或LaTeX时方便;但是生成的图很好。例如,请参见Skak样式的PDF示例的第4页。此外,我相信此PDF示例的第4页显示了您可能更喜欢Schwalbe-chess风格,尽管它的文档似乎全是德语的。无论如何,所有这些都是开源的。)
我的解决方案是使用象棋国际象棋或象棋案件象棋字体。
例如,使用这样的字体,起始位置是这样写的:
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
并且(假设line-height设置为字体的高度)看起来像这样(此处使用Chess Merida作为字体):
所以我写了这个Python脚本,将fen转换为这种格式。调用此脚本(假设您将其命名为fen2diag.py),python fen2diag.py "<the fen>"
它将打印出图字符串。
import sys
def fen2diag(fen, borders=False):
"""
Convert a fen to a diagram string used by fonts like
'Chess Merida' and 'Chess Cases'.
fen: The fen. For example the fen for the startposition is
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'.
borders: If the returned diagram string shall have borders.
Returns the diagram string.
"""
# We dont need anything except the piece positions.
fen = fen[:fen.find(' ')]
# Transposition table for the black pieces.
# White pieces are the same in both formats.
t = {'k': 'l', 'q': 'w', 'r': 't', 'b': 'v', 'n': 'm', 'p': 'o'}
# If the current square is a white square or not.
w = False
def todiagletter(fenletter):
""""
Return the diagram letter corresponding to the letter in the fen.
"""
nonlocal borders, w
w = not w
if fenletter == '/':
# In the diagram font these are the characters for the diagram borders:
# '1' upper left, '2' upper, '3' upper right,
# '4' left, '5' right,
# '7' bottom left, '8' bottom, '9' bottom right
return '5\n4' if borders else '\n'
else:
# this code handles numbers in the fen, denoting empty squares.
try:
# this is a number between 1 and 8.
n = int(fenletter)
# This will be a string denoting empty squares.
# Would be eg. ' + + + +' for an empty eight rank.
spaces = []
while n > 0:
# In the diagram font ' ' denotes a white square
# and '+' denotes a black square.
spaces.append(' ' if w else '+')
w = not w
n -= 1
w = not w
return ''.join(spaces)
# this code handles piece letters in the fen.
except ValueError:
# a black piece
if fenletter in t:
fenletter = t[fenletter]
# In the diagram font lowercase letters denote
# pieces on white squares and uppercase letters
# denote pieces on black squares.
return fenletter.lower() if w else fenletter.upper()
diagram = ''.join(map(todiagletter, fen))
if borders:
return f'1222222223\n4{diagram}5\n7888888889'
else:
return diagram
if __name__ == '__main__':
print(fen2diag(sys.argv[1], borders=True))
这些图表字体还支持标有点或星号的正方形,另一种类型的边框,圆角边框,左/底边框上的数字/字母(表示行/列)。我没有将此包含在脚本中。随时更新我的代码。
Chessbase还制作了一个字体家族(以'DiagramTT ...开始),支持更多的东西(例如旋转180°的片段),但是这种字体将内容映射到不同的代码点,对于黑色正方形,也采用两个字母,一个为背景,一个为片。