es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo organizar objetos en filas y columnas y exportar en .svg

Soy nuevo en Python y estoy tratando de acceder a la base de datos de QuickDraw de Google y organizar una cantidad de imágenes (líneas vectoriales) según la entrada del usuario de columnas y filas, luego exportar en formato de archivo .svg. Hasta ahora, solo he logrado guardar cada imagen como .gif y mostrarla. ¿Cómo puedo organizarlas en una cuadrícula de, digamos, 3×3 y en formato .svg?

Aquí está el código que tengo hasta ahora:

from PIL import Image, ImageDraw
from quickdraw.data import QuickDrawData

rows = int(input("¿Cuántas filas quieres? "))
columns = int(input("¿Cuántas columnas quieres? "))
rows_columns = rows * columns
name_var = 0

for image in range(0, rows_columns):

    qd = QuickDrawData()
    duck = qd.get_drawing("duck")
    duck_image = Image.new("RGB", (255, 255), color=(255, 255, 255))
    duck_drawing = ImageDraw.Draw(duck_image)

    for stroke in duck.strokes:
        for coordinate in range(len(stroke)-1):
            x1 = stroke[coordinate][0]
            y1 = stroke[coordinate][1]
            x2 = stroke[coordinate+1][0]
            y2 = stroke[coordinate+1][1]
            duck_drawing.line((x1, y1, x2, y2), fill=(0, 0, 0), width=2)

    duck_image.show()
    name_var += 1
    duck.image.save(f"mi_pato{name_var}.gif")

Esto es idealmente cómo debería verse el resultado y en formato de archivo .svg: Enlace a la imagen.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para organizar las imágenes en un formato de rejilla, puedes usar la biblioteca numpy de Python para dar forma a la lista de imágenes en un arreglo multidimensional. Luego, utilizando la biblioteca svgwrite, puedes crear un archivo SVG y colocar cada imagen en la posición correspondiente de la rejilla.

    Aquí tienes un ejemplo de implementación del código:

    from PIL import Image, ImageDraw
    from quickdraw.data import QuickDrawData
    import numpy as np
    import svgwrite
    
    # Entrada del usuario
    rows = int(input("¿Cuántas filas desea? "))
    columns = int(input("¿Cuántas columnas desea? "))
    
    # Cargar las imágenes
    qd = QuickDrawData()
    images = [qd.get_drawing("duck") for _ in range(rows * columns)]
    
    # Convertir las imágenes al formato SVG y colocarlas en la rejilla
    cell_width = 300
    cell_height = 200
    grid = np.array(images).reshape((rows, columns))
    
    dwg = svgwrite.Drawing('output.svg', size=((columns+1)*cell_width, (rows+1)*cell_height))
    for row in range(rows):
        for col in range(columns):
            image = grid[row, col]
            image_svg = svgwrite.image.Image(f"mi_pato{nombre_variable}.gif", size=(cell_width, cell_height)).rotate(90)
            dwg.add(image_svg)
            image_svg.translate([col*cell_width, (rows-row)*cell_height])
    
    dwg.save()
    

    Esto debería producir un archivo SVG llamado output.svg que contiene las imágenes dispuestas en una rejilla, con cada celda teniendo un ancho de 300 píxeles y una altura de 200 píxeles. Ten en cuenta que se usa la llamada al método rotate(90) para rotar las imágenes en el SVG de manera que coincidan con la orientación deseada en la imagen de ejemplo.

Comments are closed.