비트 맵이 아닌 고품질 다이어그램 소프트웨어


14

FEN을 사용하여 PDF, Postscript, Windows 메타 파일 또는 1200x1200dpi 이상으로 잘 보이는 고품질 다이어그램을 생성 할 수있는 것보다 소프트웨어를 찾고 있습니다 . 다양한 체스 엔진이 그렇게 할 것이라고 생각했지만 다이어그램은 모두 비트 맵이며 (알 수있는 한) 임의로 크기를 조정할 때 쓰레기처럼 보입니다. 또한 자체 게시 내보내기는 AFAICT 표준에서 편집 할 수 없습니다.

지불 할 용의.


apronus.com/chess/diagram/editor/…를 확인하십시오 .-아마도이 큰 다이어그램은 결국 귀하의 요구를 충족시킬 것입니다. 어쨌든 특정 요구에 맞게 도구를 조정하는 방법에 대해서는 웹 마스터 (me)에게 문의하십시오.
DrCapablasker 2018 년

내가 이전에 언급 한 것처럼 필요한 도구를 제공 할 수 있습니다. 각 조각에 대한 개별 SVG 파일에서 SVG 다이어그램을 만들려고합니다. 내가 제안한대로 연락하지 않고 현상금을 시작했습니다.
DrCapablasker

라텍스 패키지 "skak": link 을 고려 하셨습니까? FEN 문자열을 직접 사용할 수 있습니다.
U. Hjort

답변:


11

thb가 지적했듯이 벡터가 필요합니다. 파이썬 벡터를 사용하여 SVG 벡터 이미지를 생성하는 것이 좋습니다.

전제 조건 :

  1. 파이썬 2.6 이상 또는 3.3 이상
  2. 파이썬 체스 :
    • pip를 사용하여 pypi 양식을 설치하십시오 .pip install python-chess[uci,gaviota]

스크립트 작성

SVG를 여러 개 생성해야 할 수도 있으므로 스크립트를 만들어 봅시다. 따라서 스크립트를 사용하여 여러 개의 체스 판을 쉽게 생성 할 수 있습니다. 다음은 Python 3.x로 작성되었습니다. 예를 들어, FENtoSVG.py와 같은 Python 스크립트를 작성하십시오. 다음 코드를 삽입하십시오.

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.

용법

파이썬을 알고 있다면 이것은 매우 간단한 스크립트이지만 코딩하지 않는 사람들을 위해 간단하게 유지하고 싶습니다. 스크립트를 사용하려면 스크립트를 저장 한 CMD / 터미널을여십시오. 그런 다음 다음과 같이 사용하십시오.

./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

이것이 지금까지 최고이기 때문에 현상금을 수여하지만, 우리는 워드 프로세싱과 잘 통합 된 것을 추구 할 수있는 방법이 있습니다.
앤드류 나사로

훌륭한 도서관에 대한 유용한 팁. 마지막 이동 또는 보드 스타일에 화살표를 지정하는 예가 있습니까? 명확히하기 위해-./FENtoSVG.py를 통해가 아니라 python-chess를 통해 내 스크립트에서 수행하려고합니다.
Joe

3

벡터 형식 에 맞게 것이다.

아시다시피, 벡터 형식은 그래픽을 비트 맵이 아니라 기하학적으로 표현하여 모든 규모로 렌더링 할 수있는 수학적 설명으로 나타냅니다.

웹 표시에는 SVG 형식을 사용할 수 있습니다. 다음 은 SVG 형식의 일부 체스 맨입니다. 링크를 따라 가면 각 체스 맨에 대해 "원본 파일 (SVG 파일)"을 클릭하십시오. 클릭 할 때까지 SVG에 대한 비트 맵, PNG 근사치 만 얻을 수 있습니다. 실제 SVG를 원합니다.)

PDF 표시를 위해 TeX에는 사용할 수있는 여러 패키지가 있습니다. 여기 에 목록이 있습니다. (TeX 또는 LaTeX에 익숙한 경우에만 편리하지만 결과 다이어그램은 양호합니다. 예를 들어 Skak 스타일 의이 PDF 예제 4 페이지를 참조하십시오 . 또한 이 PDF 예제의 4 페이지 는 Schwalbe-chess 스타일은 문서가 모두 독일어로되어 있지만 선호 할 수도 있지만, 모두 오픈 소스입니다.)


1
마지막 예제 (하모니)의 다이어그램은 품질이 낮다고 생각합니다. 흰색 사각형은 가로 공간이 너무 적으므로 왼쪽으로 너무 멀어서 h 파일과 보드 가장자리 사이에 큰 간격이 생깁니다. 이 다이어그램은 마치 cTane.org/tex-archive/macros/latex/contrib/…에 있는 LaTeX 패키지 "chess-problem-diagrams"로 만든 것처럼 보입니다 . 해당 패키지를 사용하여 만든 다이어그램에는 동일한 버그가 있습니다.
Rosie F

3

내 솔루션은 Chess Merida 또는 Chess Cases 와 같은 체스 글꼴을 사용하는 것 입니다.

예를 들어 이러한 글꼴을 사용하면 시작 위치가 다음과 같이 작성됩니다.

1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889

그리고 (행 높이가 글꼴 높이로 설정되어 있다고 가정하면) 다음과 같습니다 (여기서는 Chess Merida 를 글꼴로 사용).

여기에 이미지 설명을 입력하십시오

그래서 fen 에서이 형식으로 변환하는이 Python 스크립트를 작성했습니다. 이 스크립트를 호출하고 ( 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도 회전 한 조각과 같은)이 글꼴은 다른 코드 포인트에 매핑합니다. 검은 사각형의 경우 두 글자가 사용됩니다. 배경과 조각에 대한 하나.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.