Software diagramma di alta qualità (non bitmap)


14

Sto cercando un software che possa prendere FEN e generare un diagramma di alta qualità , in PDF, Postscript, metafile di Windows o qualcos'altro che sembrerà a 1200x1200 dpi o migliore. Pensavo che i vari motori di scacchi lo avrebbero fatto, ma i loro diagrammi sono tutti bitmap (per quanto ne so) e sembrano spazzatura quando vengono ridimensionati arbitrariamente. Inoltre, la loro esportazione editoriale non può essere modificata in alcuno standard, AFAICT.

Disposto a pagare.


Dai un'occhiata a apronus.com/chess/diagram/editor/… - Forse i diagrammi così grandi risponderanno alle tue esigenze dopo tutto. In ogni caso, puoi contattare il webmaster (me) per adattare lo strumento alle tue esigenze specifiche.
DrCapablasker,

Come ho scritto nel mio commento precedente, posso fornire lo strumento di cui hai bisogno. Sto pensando di creare un diagramma SVG da singoli file SVG per ogni pezzo. Hai lanciato una taglia senza contattarmi come ho suggerito.
DrCapablasker,

Hai considerato il pacchetto Latex "skak": link ? Può prendere direttamente una stringa FEN.
U. Hjort,

Risposte:


11

Come sottolineato da thb, hai bisogno di vettori. Ti suggerisco di usare un pitone-scacchi per generare immagini vettoriali SVG.

Prerequisiti:

  1. Python 2.6+ o 3.3+
  2. Scacchi di pitone :
    • Installa form pypi usando pip:pip install python-chess[uci,gaviota]

Creare uno script

Poiché potresti dover generare più SVG, creiamo uno script. Quindi, puoi usare lo script per generare facilmente più scacchiere. Quanto segue è scritto in Python 3.x. Crea uno script Python, ad esempio FENtoSVG.py. Inserisci il seguente codice:

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()

Se sei su Linux, inizia lo script con #!/usr/bin/env python3.

uso

Ora, questo è uno script molto semplice se conosci Python ma voglio mantenerlo semplice per coloro che non scrivono codice. Per utilizzare lo script, aprire CMD / Terminale in cui è stato salvato lo script. Quindi, utilizzare come segue:

./FENtoSVG.py "examplefen" "morefen"

Dire che voglio due SVG per la FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"e "8/8/8/8/4Q3/8/8/8 w - - 0 1" , vorrei inserire:

./FENtoSVG.py "8/8/8/8/4N3/8/8/8 w - - 0 1" "8/8/8/8/4Q3/8/8/8 w - - 0 1"

Ciò creerebbe due file: 88884N3888 w - - 0 1.SVGe88884Q3888 w - - 0 1.SVG

Suggerisco python-chess a causa delle personalizzazioni che possono essere facilmente fatte al diagramma usando le funzioni integrate. È anche ben documentato.


Complimenti per la raccomandazione chiara, facile da usare e completa, @Fluxenein. Sto dando un'occhiata a questo approccio per le mie esigenze editoriali. Benvenuto nella community!
jaxter,

Grazie! È ancora un compito piuttosto noioso, quindi probabilmente continuerò ad aggiornarmi fino a quando creerò / troverò una soluzione abbastanza veloce anche per le mie esigenze.
MrFregg,

Assegnare la generosità perché questo è il migliore finora, ma abbiamo un modo per fare qualcosa di ben integrato con l'elaborazione dei testi.
Andrew Lazarus,

ottimi consigli su una grande biblioteca. c'è un esempio di come specificare le frecce per l'ultima mossa o lo stile della tavola? per chiarire - cercando di farlo non tramite ./FENtoSVG.py, ma piuttosto nella mia sceneggiatura tramite python-chess.
Joe,

3

Un formato vettoriale sarebbe adatto.

Come forse saprai, un formato vettoriale rappresenta la grafica non come bitmap ma geometricamente, come una descrizione matematica che può essere visualizzata su qualsiasi scala.

Per la visualizzazione Web, è possibile utilizzare il formato SVG. Ecco alcuni pezzi degli scacchi in formato SVG. (Se segui il link, per ogni pezzo di scacchi, fai clic su "file originale (file SVG)." Fino a quando non fai clic, tutto ciò che otterrai sarà un'approssimazione PNG bitmap, in formato SVG. Vuoi il vero SVG.)

Per la visualizzazione di PDF, TeX ha diversi pacchetti che puoi usare. Ecco un elenco. (È utile solo se si ha familiarità con TeX o LaTeX; ma i diagrammi risultanti sono buoni. Ad esempio, vedere la pagina 4 di questo esempio PDF in stile Skak. Inoltre, credo che la pagina 4 di questo esempio PDF mostri lo stile di scacchi di Schwalbe, che potresti preferire, anche se la sua documentazione sembra essere tutta in tedesco. Tutti questi sono comunque open source.)


1
Penso che i diagrammi nel tuo ultimo esempio (armonie) siano di bassa qualità. I quadrati bianchi usano uno spazio orizzontale troppo piccolo, quindi sono troppo a sinistra, lasciando grandi spazi tra il file h e il bordo della scheda. Questi diagrammi mi sembrano come se fossero stati realizzati con il pacchetto LaTeX "chess-problem-diagrams", disponibile su ctan.org/tex-archive/macros/latex/contrib/… . Gli schemi che ho realizzato usando quel pacchetto hanno lo stesso bug.
Rosie F,

3

La mia soluzione è stata quella di utilizzare un font di scacchi come Chess Merida o Chess Cases .

Con un tale font, ad esempio, la posizione iniziale è scritta in questo modo:

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

E (supponendo che l'altezza della linea sia impostata sull'altezza del carattere) assomiglia a questo (qui usando Chess Merida come carattere):

inserisci qui la descrizione dell'immagine

Quindi ho scritto questo script Python che converte da fen a questo formato. Chiama questo script (supponendo che tu lo abbia chiamato fen2diag.py ) con python fen2diag.py "<the fen>"e stampa la stringa del diagramma.

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))

Questi caratteri Diagramma supportano anche i quadrati contrassegnati da punti o stelle, un altro tipo di bordo, angoli arrotondati del bordo, numeri / lettere sui bordi inferiore / sinistro che indicano le righe / colonne. Non l'ho incluso nella sceneggiatura. Sentiti libero di aggiornare il mio codice.

Chessbase ha anche creato una famiglia di font (a partire da 'DiagramTT ...') che supporta ancora più cose (come pezzi ruotati di 180 °) ma questo font mappa le cose su punti di codice diversi, anche per i quadrati neri vengono prese due lettere, una per lo sfondo e uno per il pezzo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.