簡體   English   中英

python QuickDraw 數據庫 - 在行和列中排列對象並導出到.svg

[英]python QuickDraw Database - arrange objects in rows and columns and export in .svg

初學者 python 用戶在這里。

我正在嘗試訪問 Google 的 QuickDraw 數據庫並根據用戶輸入的列和行排列大量圖像(矢量線),然后以 .svg 文件格式導出。 到目前為止,我只設法將每個圖像保存為 .gif 並顯示它。 我正在努力尋找一種方法來安排它們並在 SVG 中導出。 我可以使用哪些庫來完成這兩個任務?

這是我到目前為止的代碼:

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

rows = int(input("How many rows do you want? "))
columns = int(input("How many columns do you want? "))
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"my_duck{name_var}.gif")

理想情況下,結果應該是這樣的,並且在.svg 文件格式中。

提前致謝!

您將需要一個 python 庫,該庫可以包含 output SVG 文件。

不幸的是,我沒有時間用剛剛運行的代碼片段提供詳細的答案,但希望我能提供一些指導。

有多個 python 模塊來編寫 SVG 文件: svgwrite就是其中之一(文檔示例)。

基於示例代碼段:

import svgwrite

dwg = svgwrite.Drawing('test.svg', profile='tiny')
dwg.add(dwg.line((0, 0), (10, 0), stroke=svgwrite.rgb(10, 10, 16, '%')))
dwg.add(dwg.text('Test', insert=(0, 0.2), fill='red'))
dwg.save()

您應該能夠執行以下操作:

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

dwg = svgwrite.Drawing('test.svg', profile='tiny')

rows = int(input("How many rows do you want? "))
columns = int(input("How many columns do you want? "))
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)
            # you many need to offset dwg.line using row/col grid index and drawing size
            dwg.add(dwg.line((x1, y1), (x2, y2), stroke=svgwrite.rgb(10, 10, 16, '%')))

    duck_image.show()
    name_var += 1
    duck.image.save(f"my_duck{name_var}.gif")
# save svg of all ducks (grid)
dwg.save()
    

請記住,上面的代碼未經測試,但希望它說明了這一點。 如果您是該模塊的新手,我推薦一步一步的方法:

  1. 編寫基本 svg 的基本測試腳本(例如示例代碼段):確保模塊安裝正確且工作正常
  2. 使用 quickdraw 和 svgwrite 繪制單只鴨子的基本腳本
  3. 繪制鴨子網格的腳本

這個想法是,如果任何步驟失敗,單獨調試/修復會更容易。

我懷疑您可能還需要計算出每只鴨子的尺寸/邊界框,並將網格縮放/對齊到相同大小的矩形,然后偏移每條線的坐標。 從理論上講,您可以將每只鴨子繪制為一個組,然后只需 SVG 翻譯每個組,使其對齊為網格(而不是所有鴨子重疊)

此外,您可能會發現 sketch-rnn 很有趣,因為它使用了 quickdraw 數據集。 特別是查看 David Ha 的Sketch-RNN Colab 筆記本或他的sketch-rnn/utils.py腳本。 盡管 QuickDraw 筆畫格式與 sketch-rnn 筆畫格式略有不同,但仍有很多相似之處,並且上面的鏈接包括用於繪制 svg 網格的實用函數。 他們需要適應 QuickDraw 的格式。

If you're not constrained to Python alone and are comfortable with a bit of JavaScript the QuickDraw dataset README already inlcudes a link to a d3.js SVG demo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM