Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。
以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。
ラスタライズ変換にはImageMagickの convert が使用でき、DPI的な設定 -density 600 でサイズ調整している。
元画像はこちら
変換結果はこのようになってしまう。
30枚の画像をSVGからJPGへ変換した結果、6枚ほど結果が明らかにおかしい。
失敗しているものを拡大した抜粋。
真っ白で明らかに変換できていないものもあれば、circle要素などSVG画像から一部が抜け落ちてしまっているものもある。
また上のような真っ白な変換失敗や大きなパーツの欠損は明らかに見てわかるのでまだ良いが、小さなパーツの漏れ欠けがあるかもしれないし、そうなると今回のように多数の画像を扱っている中では見落としが起こると思う。
コマンドラインでバッチ処理したのだが、いくつかはエラーが通知されている。
```
```
ただ、 ` memory allocation failed` とはいうものの、メモリはかなりとっているのだが。
``` /etc/ImageMagick-6/policy.xml
```
小さなサイズで出力してみる。
```convert -density 600 $filename.svg $filename-ss.jpg
convert -density 90 $filename.svg $filename-3ss.jpg
```
小さなサイズで出力すると、たしかに結果が改善する。
エラー通知も1個減っていた。
とはいえ、ストックサイトへ登録するにあたっては大きいサイズでほしいのだが。
GIMPでもSVGをインポートしてラスタライズすることができる。
GUI操作で読み込むと任意のスケールで問題なく読み込めるのだが、CLI呼び出しでバッチ処理に使おうとすると、きちんと変換された結果が出ない。
画像のような変換結果になる。変換されているごく一部のパーツを見るだけでも、明らかに画質が悪い。
またこの場合は背景を 白背景で書き出せば上手く行きそうに見えるが、試した範囲では、変換結果が真っ白になるだけで上手く行かなかった。
以下、うまく行かなかったGIMPでのSVGインポート変換を一応抜粋。
```
# GIMPのコマンドを使ってSVGを読み込む
gimp -i -b - <<EOF
(let* (
(image (car (gimp-file-load RUN-NONINTERACTIVE "$input_file" "$input_file")))
(drawable (car (gimp-image-get-active-layer image)))
(new-width $size)
(new-height $size)
)
(gimp-image-scale image new-width new-height)
(file-jpeg-save RUN-NONINTERACTIVE image drawable "$output_file" "$output_file" 0.9 0 1 0 "" 0 1 0 1)
(gimp-image-delete image)
)
(gimp-quit 0)
EOF
```
またGIMP操作にはもう1つ、Pythonからgimpfuを経由して呼び出す方法もあり、こちらは上野LISPな古いGIMPスクリプトより高度な操作ができるのだが、現状GIMPがPython3に対応していないとかで、今回は断念した。