国旗の使い方1

これです

モチベーション

国旗って眺めてるだけで面白くないですか?アルゼンチンの

アルゼンチンの国旗

真ん中のやつとかなかなか良い表情をしてます。

f:id:chikulla:20161212103839p:plain




じゃあこれはだーれだ?

f:id:chikulla:20161212104802p:plain




はいウルグアイでしたー

Flag of Uruguay.svg




じゃあ朴訥な彼は?

f:id:chikulla:20161212104954p:plain




え?エクアドルっすよ!

エクアドルの国旗

こういう国旗の画像を集めてCocoaとかから使いたい。

収集

国連加盟国だけでも193あるので、一枚にかけるサイズは抑えつつ、国旗に細かく描かれていることを表現してもらいたい。ので、ベクターイメージを集めることにする。WikipediaFlag_of_国名.svgのファイルを引っ張ってくるんでもいいが、ググったら一発目で

f:id:chikulla:20161212111855p:plain

見つけちゃった

github.com

これを使うことにします。

CocoaでのSVGの扱い

Cocoa ApplicationでSVGを直に使うことはできません。残念でした。SVGを扱えるようにするライブラリは色々あるのですが、

https://github.com/SVGKit/SVGKit https://github.com/mchoe/SwiftSVG

SVGを使えるようにする程度ならそんなにめんどくさくないので自分で加工します。具体的にはSVGをPDFにしちゃえばいいだけです。PDF変更後のファイルサイズは最悪SVGの2倍くらいになっちゃうのですが、元の国旗のSVGはでかくても数十kbなのであんまり気にしない。

npm install

git cloneでもいいんですが、ここでは後々のためにnpmで管理します。 package.jsonを書いて

{
  "dependencies": {
    "flag-icon-css": "^2.8.0"
  }
}

npm installしましょう

npm install

はい

SVG > PDF

node_modules/flagsの中に1x1と4x3の比率のsvgが転がってます。 国旗の形とかサイズはその国が勝手に規定してるものなんですが、オリンピックとかになると4x3に統一されたりするらしいです。 ネパールとかいう異端児もいますが、

ネパールの国旗

ここでは我慢して長方形の枠の中に収まっていただきたい。

SVGからPDFへの変換は、精度が良かったprawn-svgを使います。rubyです。

github.com

package.jsonと同じところにgenerate.rbを作ります。

require "prawn"
require "prawn-svg"
src = "./node_modules/flag-icon-css/flags/4x3/"
dist = "./dist/"
Dir.mkdir(dist) unless File.exists?(dist)
Dir.entries(src).select { |f|
  if File.extname(src + f)==".svg"
    name = File.basename(src + f, ".svg")
    Prawn::Document.generate(dist + name + ".pdf", page_size: [600, 800], page_layout: :landscape) do
      svg IO.read(src + f), position: :center, vposition: :center, width: 800, height: 600
    end
  end
}

ついでにpackage.jsonスクリプトも追加して

{
  "scripts": {
    "gem:install": "gem install prawn-svg",
    "pdf": "ruby generate.rb"
  },
  "dependencies": {
    "flag-icon-css": "^2.8.0"
  }
}

svgを丸ごとpdfにします。

npm run gem:install
npm run pdf

はいできた

f:id:chikulla:20161212234105p:plain

ここまでできたらCocoaのAssetを追加してドラッグ&ドロップするだけですが、255ファイルあるんでいちいち追加するのは辛いです。次回は全部の国旗をCocoaからごそっと丸ごと使えるようにします。