高质量(非位图)图表软件


14

我正在寻找比FEN能够生成PDF,Postscript,Windows图元文件或其他看起来更好的1200x1200 dpi或更高质量的高质量图表的软件。我以为各种国际象棋引擎都可以做到,但是它们的图表都是位图(据我所知),并且在任意调整大小时看起来像垃圾。而且,他们自己的发布导出内容无法以任何标准AFAICT进行编辑。

愿意付钱。


查阅apronus.com/chess/diagram/editor/…-也许这么大的图表毕竟可以满足您的需求。无论如何,您都可以与网站管理员(me)联系,以根据您的特定需求定制工具。
DrCapablasker

就像我在之前的评论中所写的那样,我可以提供所需的工具。我正在考虑从每个SVG文件创建SVG图。您未按照我的建议与我联系就开始了赏金活动。
DrCapablasker '16

您是否考虑过Latex软件包“ skak”:链接?它可以直接使用FEN字符串。
U. Hjort

Answers:


11

正如thb所指出的,您需要向量。我建议您使用python-chess生成SVG矢量图像。

先决条件:

  1. Python 2.6+或3.3+
  2. Python-chess
    • 使用pip 安装pypi表单: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.SVG88884Q3888 w - - 0 1.SVG

我建议使用python-chess,因为可以使用内置函数轻松地对图进行自定义。它也有据可查。


恭喜@Fluxenein提供清晰,易于使用且全面的推荐。我正在研究这种方法以满足我的发布需求。欢迎来到社区!
jaxter

谢谢!对我来说,这仍然是一个繁琐的任务,因此我可能会不断更新,直到我也为自己的需求找到/找到足够快的解决方案为止。
MrFregg '16

授予赏金是因为这是迄今为止最好的,但是我们有一种方法可以实现与文字处理完美集成的功能。
安德鲁·拉扎鲁斯

很棒的图书馆上的很棒的提示。有没有为最后一招指定箭头或棋盘样式的示例?要澄清-希望不通过./FENtoSVG.py来执行此操作,而是通过python-chess在我自己的脚本中进行操作。

3

一个矢量格式配不配。

如您所知,矢量格式不是将图形表示为位图,而是将图形表示为数学描述,并且可以按任意比例绘制图形。

对于Web显示,可以使用SVG格式。是一些SVG格式的西洋棋棋子。(如果您点击链接,对于每个国际象棋棋子,请单击以访问“原始文件(SVG文件)。”直到单击此链接,您所得到的只是与SVG的位图,PNG近似值。您需要真实的SVG。)

对于PDF显示,TeX有几个可以使用的软件包。是清单。(这仅在您熟悉TeX或LaTeX时方便;但是生成的图很好。例如,请参见Skak样式的PDF示例的第4页。此外,我相信此PDF示例的第4页显示了您可能更喜欢Schwalbe-chess风格,尽管它的文档似乎全是德语的。无论如何,所有这些都是开源的。)


1
我认为您上一个示例(和声)中的图表质量很差。白方块占用的水平空间太小,因此它们离左侧太远,在h形文件和木板边缘之间留有很大的空隙。这些图在我看来就像是由LaTeX软件包“ chess-problem-diagrams”制作的,该软件包可从ctan.org/tex-archive/macros/latex/contrib/…获得。我使用该软件包制作的图表也有相同的错误。
Rosie F

3

我的解决方案是使用象棋国际象棋象棋案件象棋字体。

例如,使用这样的字体,起始位置是这样写的:

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°的片段),但是这种字体将内容映射到不同的代码点,对于黑色正方形,也采用两个字母,一个为背景,一个为片。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.