0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

写真からストリングアート図案を自動生成するWebツールを作った(SVG/番号のみ出力に対応)

0
Posted at

写真からストリングアート図案を自動生成するWebツールを作った(SVG/番号のみ出力に対応)

こんにちは。<<<名前(例:蛙嘟嘟)>>> です。
最近、写真をアップロードするだけでストリングアート(糸かけアート)の図案を自動生成するWebツール String Art Generator を公開しました。
先日のアップデートで プレビューの鮮明化「番号のみ」エクスポート に対応しました。


デモと使い方

  1. 画像をアップロード(JPG/PNG)
  2. 釘の数・線の本数(密度)・直径などを調整
  3. プレビューを確認(強化済みで見やすい)
  4. SVG / PDF、または 釘番号のみ(例:1, 140, 248, 20, ...) をエクスポート

👉 ツール本体:String Art Generator


実装メモ(アルゴリズムの概要)

  • 円周上に N 本の釘を配置(極座標で等間隔)
  • 入力画像をグレースケール化し、エッジ/明度に基づく「誤差画像」を用意
  • 現在位置から次の釘候補を走査し、「線分を引いたときの誤差減少量」をスコアリング
  • 最も誤差を減らす釘を採用して線を追加(貪欲法)
  • 一定本数まで反復し、SVG パスとして出力
    (「番号のみ」モードでは n1 -> n2 -> n3 -> ... をカンマ区切りで出力)

参考:線の重ねがけでコントラストが上がるため、同じ辺を複数回通ることを許容。モアレ等が出る場合は「釘数」「最小角度」「同一点の連続回数」などで調整。

疑似コード(抜粋)

curr = 0
path = [curr]
for i in 1..maxLines:
  best = None
  bestGain = -INF
  for next in 0..N-1 where next != curr:
    gain = errorDecreaseIfDraw(curr, next)
    if gain > bestGain:
      bestGain = gain
      best = next
  drawLine(curr, best)
  curr = best
  path.append(curr)
exportAsSVG(path) or exportAsNumbers(path)
![WechatIMG26430.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4178945/3d0336bc-d3b2-4213-b899-1231f27555ee.jpeg)
![WechatIMG26447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4178945/a504f9b2-d29f-4710-ab98-9c7f53b51822.jpeg)
![截屏2025-08-24 23.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4178945/96735b92-cfb6-4d45-aab6-f56240ff7b43.png)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?