Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Un ejemplo de PIL/Pillow
#1
Hola,
os pongo un ejemplo de como dibujar un tablero de ajedrez con esta libreria.
utiliza un validador de jugadas y control de la partida, el cual no lo pongo. Si estais interesados en estos temas os lo paso.

Bueno... a lo que vamos. Os pongo el programita:


Código:
# Python 3.6.1
from PIL import Image

# libreria que valida las jugadas y tablero interno
import pyajedrez.pyAjedrez_v3 as aje

piezas_png = {
   'b' : "imagenes/piezas/Merida60/bb.png",  #alfil negro
   'k' : "imagenes/piezas/Merida60/bk.png",  #rey negro
   'n' : "imagenes/piezas/Merida60/bn.png",  #caballo negro
   'p' : "imagenes/piezas/Merida60/bp.png",  #peon negro
   'q' : "imagenes/piezas/Merida60/bq.png",  #dama negra
   'r' : "imagenes/piezas/Merida60/br.png",  #torre negra
   
   'B' : "imagenes/piezas/Merida60/wb.png",  #alfil blanco
   'K' : "imagenes/piezas/Merida60/wk.png",  #rey blanco
   'N' : "imagenes/piezas/Merida60/wn.png",  #caballo blanco
   'P' : "imagenes/piezas/Merida60/wp.png",  #peon blanco
   'Q' : "imagenes/piezas/Merida60/wq.png",  #dama blanca
   'R' : "imagenes/piezas/Merida60/wr.png",  #torre blanca
   
   'False' : "imagenes/piezas/Merida60/clear.png"  #casilla transparente
}

escaques_png = {
   'negro' : "imagenes/piezas/Merida60/dark.png",  # casilla negra
   'blanco': "imagenes/piezas/Merida60/light.png"   # casilla blanca
}

TAMANO_ESCAQUE = 40
TAMANO_PIEZA = int(TAMANO_ESCAQUE * 0.90)   # el 90% de la casilla

# instanciamos la clase ajedrez
partida = aje.Ajedrez()

# para ajustar las imagenes
ajusta = Image.ANTIALIAS


def alterna_color_casilla(color_actual):
   if color_actual == escaques_png['negro']:
       return escaques_png['blanco']
   else:
       return escaques_png['negro']
   

def crea_tablero(jugada = None, tam_casilla = TAMANO_ESCAQUE, tam_pieza = TAMANO_PIEZA):
   img_fondo = Image.new("RGBA", (tam_casilla * 8, tam_casilla * 8), (255, 255, 255))
   dicc_piezas = partida.toArray()
   # tiene el formato:
   # dicc_piezas = {'a8': 'r', 'b8' : False, 'c4' : 'N', etc...}
   # creamos el tablero, casillas y puezas
   color_casilla = escaques_png['negro']
   
   #coords. para pegar las casillas y piezas
   tabula_fila = 0
   tabula_columna = 0
   
   for fila in range(8,0,-1):
       # empezamos por la casilla sup. izq. que es blanca
       color_casilla = alterna_color_casilla(color_casilla)    
       
       for columna in range(ord('a'), ord('i')):
           nombre_casilla = chr(columna) + str(fila)
           
           img = Image.open(color_casilla)
           img_casilla = img.resize((tam_casilla*8, tam_casilla*8), ajusta)
           
           # para centrar la pieza sobre cada casilla
           ancho_x, alto_y = img.size
           offset = ((ancho_x - alto_y) // 2, (ancho_x - alto_y) // 2)
           
           # buscamos la pieza que hay en nombre_casilla
           pieza = dicc_piezas[nombre_casilla]
           if not pieza :      #si la casilla esta vacia, esto es False
               pieza = 'False'
           
           # las piezas son transparentes: se añade el convert
           img_pieza = Image.open(piezas_png[pieza]).convert("RGBA")
           img_pieza = img_pieza.resize((tam_pieza, tam_pieza))
           img_casilla.paste(img_pieza, offset, img_pieza)
           img_fondo.paste(img_casilla, (tabula_columna, tabula_fila))
           
           tabula_columna = tabula_columna + tam_casilla
           color_casilla = alterna_color_casilla(color_casilla)
           
           
       tabula_columna = 0
       tabula_fila = tabula_fila + tam_casilla
       
   img_fondo.show()
   
   
   

def inicia_grafico():
   #print(partida.toArray())   es el tablero en forma de diccionario
   # empezamos dibujando el tablero de inicio
   crea_tablero()
   # hacemos una jugada
   jugada = partida.moveSAN('e4')
   crea_tablero()
   

if __name__ == "__main__":
   inicia_grafico()
   
   
"""
Todo esto es muy lento,
Mejor hacerlo en memoria. Para ello convertimos las imagenes en bytes y las guardamos:

#genera_piezas_BytesIO.py

import io, pickle

from PIL import Image

ficheros = {
   'b' : "./Merida45/bb.png",  #alfil negro
   'k' : "./Merida45/bk.png",  #rey negro
   'n' : "./Merida45/bn.png",  #caballo negro
   'p' : "./Merida45/bp.png",  #peon negro
   'q' : "./Merida45/bq.png",  #dama negra
   'r' : "./Merida45/br.png",  #torre negra
   
   'B' : "./Merida45/wb.png",  #alfil blanco
   'K' : "./Merida45/wk.png",  #rey blanco
   'N' : "./Merida45/wn.png",  #caballo blanco
   'P' : "./Merida45/wp.png",  #peon blanco
   'Q' : "./Merida45/wq.png",  #dama blanca
   'R' : "./Merida45/wr.png",  #torre blanca
   
   'None' : "./Merida45/clear.png"  #casilla transparente
}
piezas_png = {}

for nombre, pieza in ficheros.items():
   im = Image.open(ficheros[nombre])
   salida = io.BytesIO()
   im.save(salida, format="PNG")
   piezas_png[nombre] = salida.getvalue()


with open("piezas_png.py", "wb") as fich:
   fich.write(pickle.dumps(piezas_png))
   
###################################
Hariamos lo mismo para los escaques
###################################

luego, el programa de arriba lo modificariamos empezando con:

#tablero_png.py
import pickle
PIEZAS = pickle.load(open( "./pyajedrez/piezas_png.py", "rb" ))
etc....

###############################################
y por ultimo leeriamos las piezas y escaques asi:
p.ej. en Tkinter
###############################################

from tkinter import *
import io

from PIL import Image, ImageTk
import pyajedrez.tablero_png as tab

root = Tk()

frm = Frame(root)
frm.pack()

imagen_bytes = io.BytesIO(tab.PIEZAS['Q'])
image = Image.open(imagen_bytes)

tkimg = ImageTk.PhotoImage(image)
print(type(tkimg))
etiqueta = Label(frm, width=45, height=45, image = tkimg)
etiqueta.pack()

root.mainloop()
"""

el hilo lo he puesto aqui, porque no usa gui alguna.

espero que os sirva la idea.

saludos.

Edito:

Pongo el enlace para descargar el ejemplo completo funcionando. Está escrito a vuelapluma en un par de horas, pero funciona. Explicaciones en el fichero LEEME.txt

Ejemplo uso Pillow
Responder
#2
Hola calvicius, muchas gracias por el código.

Saludos!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)