SVG画像を目的のサイズのPNGまたはICOにバッチ変換する


26

VB.Net 2010で開発するアプリケーションに使用したいSVGアイコンがたくさんありますが、SVGアイコンを処理するサポートがないため、これらのアイコンをPNGまたはICOに変換する必要があります出力解像度。Ubuntu用のこのようなコマンドラインツールを見つけましたrsvgconvert。Windows用のそのようなツールもありますか?

回答:


12

ImageMagickには、LinuxおよびWindows(およびその他)で使用可能なコマンドラインツールがあります。変換ツールは、便宜上「変換」と呼ばれます。使用方法のドキュメントを次に示します

そして、ここからWindowsインストーラーを入手できます。


あなたはまた、とLinux用のWindowsサブシステム(WSL)を介してそれを得ることができますapt install imagemagick
antonyh

(これはLinuxに適用され、Windowsにも適用されます)IMで-verboseを有効にすると、IM自体がinkscapeを使用して中間epsファイルを作成するように見えます。したがって、@ zetahの答えをお勧めします

Windows用のImageMagickベースの小さなコンバーターを次に示します。fosshub.com / SVG2PNG.html古い(2014年から)ですが、引き続き機能し、ドキュメントを読む必要はありません。

20

ImageMagickは、画像が関係するバッチタスクだけにすぐに関連付けるべきではありません。特に、ImageMagickがSVG変換の貧弱なソリューションであるこの場合。

コマンドラインでInkscapeを試してみてください:

inkscape in.svg --export-png=out.png


8
inkscapeがImageMagickより優れていると言うのはなぜですか?私は同意しません(または同意しません)、詳細を知りたいだけです。
サム

imageMagickである理由はpng、jpgなどの処理に適していますが、inkscapeはベクター画像(svg)の処理に適しています
-user93

1
現状では、これはバッチ変換に関する質問に答えませんか?
ORマッパー

答えは機能しますが、Windows InkScapeでは、フォーカスを取得するスプラッシュスクリーンを遅延して表示することを要求しているため、これをバックグラウンドでバッチモードで実行することはできません。
ティムウィ

@Timwiそれはここでは起こりません。-zオプションを使用することを忘れないでください。
Svish

5

コマンドラインはそのままでは機能せず、さらに100個のファイルを変換する必要がありました。Windows 7でどのように動作するかを次に示します。

  1. inkscapeをインストールします-ポータブルなものではありません!

  2. 1つのフォルダーにすべてのsvgファイルをコピーします(例:「C:\ svgs \」):

  3. 次のconvert.bat行を内部に含むファイルを作成します。

    FOR %%A IN (*.svg) DO "C:\Program Files (x86)\Inkscape\inkscape.exe" --export-png=%%A.png
    

    (インストールの正しいフォルダーを指します):

  4. 管理者としてCMDを開きます!これを行うには、WINキーを押して「cmd」と入力し、「cmd.exe」を右クリックして「管理者として実行」を選択します。

  5. 「C:\ svgs \」に移動して入力しますconvert.bat -すべてのsvgファイルはPNGに変換されます。

  6. Windowsエクスプローラーを使用して、変換されたPNGファイルを検索します。私のPCでは、それらはフォルダにありました:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

それが役に立てば幸いです。


コマンドラインの解像度は、私が見ることができる範囲でしか設定できないため、InkscapeBatchツールを使用することになりました。そこで、すべての画像を比較的大きくするようにDPIを設定できました。

正しい設定を指定する必要があります。指定しないと機能しません。ここに私がやったことがあります:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

[完了]を押した後、ツールバーの[バッチコンバーターを開始...]ボタンを押す必要があります。

ここに画像の説明を入力してください


1
バッチコマンドには、おそらく%%A(入力ファイル名として)別のものがありません。また、なぜ管理モードでのみ動作するはずだと思いますか?
またはマッパー

それでは、ImageMagickを使用するよりも優れているのでしょうか。
reinierpost

悲しいことに、このリンクも死んだようです。(2017年8月)
イデオグラム

@Ideogramダウンロードの別のプロバイダーを見つけました。softsea.com/download/InkscapeBatch.html
カイノアック

DPIをspecifiyingためには、このオプションを追加する必要がある--export-dpi=100100は、解像度の番目の値である
Xsmael


3

SVGからPNGへの変換の場合、cairosvg(https://cairosvg.org/)の方がImageMagickよりも優れていることがわかりました。ディレクトリ内のすべてのファイルにインストールして実行する手順。

pip3 install cairosvg

.svgファイルを含むディレクトリでPythonシェルを開き、次を実行します。

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

これにより、元の.svgファイルが上書きされないようになりますが、同じ名前が保持されます。その後、すべての.pngファイルを別のディレクトリに移動できます。

$ mv *.png [new directory]

この回答は、私のかなり大きなSVGファイルで機能した唯一の回答です、ありがとう!!!
ベンサンディーン

1

これに2時間近く取り組んだ後、私はInkscapeに落ち着きました。多くの異なる解像度で多数のファイルをバッチ変換する必要があるため、Powershellスクリプトを作成しました。106個のSVGを使用すると、コンピューターが約5秒間フリーズするため、これを使用するときは注意してください。

# ENTER THE FULL PATH TO THE INKSCAPE EXECUTABLE
$inkscapeExe = "C:\Program Files\Inkscape\inkscape.exe"
# ENTER THE PATH TO THE FOLDER CONTAINING THE SVGs
$svgFolder = "C:\Images\SVG"
# ENTER THE DESIRED WIDTH
$width = 120
# ENTER THE DESIRED HEIGHT
$height = 120

$svgFiles = Get-ChildItem $svgFolder -Filter *.svg
foreach ($svgFile in $svgFiles)
{
    $inputParam  = $svgFile.FullName 
    $outputParam = "--export-png=" + $svgFile.FullName + "-" + $width + "x" + $height + ".png" 
    $widthParam  = "-w" + $width
    $heightParam = "-h" + $height

    & $inkscapeExe $inputParam $outputParam $widthParam $heightParam
}

鉱山は数秒以上凍りました。&オペレータは、新しいプロセスを開始し、あなたがSVGファイルを持っているように、このスクリプトは、多くの新しいinkscape.exeプロセスとして作成されますので、すぐに続けています。これにより、コンピューターがしばらく非常に遅くなります。
ロリー

それ| Out-Nullで始まる行の最後に配置&すると、inkscape.exeコマンドを1つずつ実行するように強制されます。
ロリー

1

Bash / Ubuntu for WindowsのSVGがあるフォルダーで、以下を使用できます。ただし、ImageMagickは最初にラスタライズしてからサイズ変更するため、奇妙なアーティファクトが生じます...

find -name "*.svg" -exec convert {} -background none -density 300 -resize 256x256 -define icon:auto-resize -alpha remove -colors 256 {}.ico \;

うまく機能していると思われるInscapeベースのソリューションも参照してください(別のスレッドから、リンクが失われました)。 mkdir temp; declare -a res=(16 24 32 48 64 128 256); for f in *.svg; do for r in "${res[@]}"; do inkscape -z -e temp/${f}${r}.png -w $r -h $r $f; done; resm=( "${res[@]/#/temp/$f}" ); resm=( "${resm[@]/%/.png}" ); convert "${resm[@]}" ${f%%.*}.ico; done; rm -rf temp;


1
1私は非常に簡略化されたバージョンではInkscapeでそれを使用しfind -name "*.svg" -exec inkscape {} -e {}.png \;、私はこのバージョンを好むものの:ls | grep ".svg" | xargs -I file inkscape file -e file.pngファイルがアルファベット順に処理されるため-これはそうではありません、使用している場合find
loved.by.Jesus


0

バッチを実行するために機能する単一のコマンドが見つからなかったため、ファイルリストを生成して一連のコマンドを作成することで、バッチを機能させることができました。これらの手順は、Windowsのすべてのバージョンで機能するはずです。すべての入力指示は引用符を除外し、その間のすべてを含みます。

これを行うには、Inkscape、MS Excel、または同等のスプレッドシートエディターとリストジェネレーターが必要です。素晴らしい小さなフリーウェアリストジェネレーターがここにあります:https : //www.portablefreeware.com/?id=1171

  • すべてのsvgファイルを1つのフォルダーにハードリンク、コピー、または移動します。
  • そのフォルダーのファイルリストを生成し、csvにエクスポートします。
  • ExcelでCSVを開き、ファイル名列を除くすべての列を削除します。また、[パス]などの列見出しと下部の要約テキストも削除します。
  • ファイル名がまだ2番目の列にない場合は、そこにカットアンドペーストします。
  • 最初の列の最初のセルにinkscapeを入力し、その後にスペースと、svgファイルが末尾のバックスラッシュを含むフォルダーパスを入力します(例: "inkscape C:\ SVG \")。次に、このセルをコピーし、その下にあるファイル名の前にあるすべてのセルを選択して貼り付けて、すべて同じテキストになるようにします。
  • 3番目の列の最初のセルに--export-png =と入力し、その後に保存先フォルダーを入力します。同じフォルダーを使用しました。構文を正しくするには、必ず先頭にスペースを追加して、残りのテキストをまとめてください(例: "--export-png = C:\ PNG \")。これをコピーして、最初の列と同じようにすべての行に貼り付けます
  • 2列目全体をコピーして、4列目に貼り付けます。4番目の列を選択した状態で、Ctrl + H(検索と置換)を押します。検索フィールドに「.svg」と入力し、置換フィールドに「.png」と入力してから、「すべて置換」を選択します。

これを正しく行った場合、次のようなファイル名ごとに1行が必要です。| inkscape C:\ SVG \ | Filename1.svg | --export-png = C:\ PNG \ | Filename1.png |

  • 5列目の最初のセルに「= concatenate(a2、b2、c2、d2)」と入力します。これは、ヘッダー列が削除されていないことを前提としています。括弧内のセル番号は、現在の行番号と一致する必要があります。最初のファイル名がB2にある場合、上記の式は正確です。それ以外の場合は、角かっこ内のセル名を最初のファイル名の行と一致するようにします(a1、b1、c1 ...など)
  • このセルをコピーして貼り付け、1列目と3列目のようにその下のすべてを塗りつぶします。
  • 次に、5番目の列全体をコピーし、[形式を選択して貼り付け]> [値]を使用して、数式で生成されたテキストを6番目の列に貼り付けます。この6列目はあなたのお金のショットです。6列目全体をコピーし、メモ帳を開いて、最後の列を貼り付けます。これを正しく行った場合、各svgファイルをpngに変換するコマンドラインが1つあります。
  • メモ帳ファイルをバッチファイルとしてInkscapeディレクトリに保存します。[名前を付けて保存]ウィンドウが開いたら、[ファイルの種類]を[すべてのファイル]に変更し、.batファイルとして保存します(例: "C:\ Program Files \ Inkscape \ SVGBatch.bat"
  • あとは、そのフォルダに移動して、保存したバッチファイルをダブルクリックするだけです。コマンドプロンプトを開き、すべてのファイルを変換する必要があります。

誰かの生活が楽になることを願っています。ジェームス


0

Kaiの答えは近いが、私には役に立たなかった。ただし、2、3のわずかな調整により、これは初めて完全に機能しました。

  1. SVGを便利な場所にコピーします
  2. 同じフォルダーにテキストファイルを作成し、名前を変更します convert.bat
  3. convert.batお気に入りのテキスト/コードエディターで開き、次を入力します。

FOR %%A IN (*.svg) DO "C:\Program Files\Inkscape\inkscape.exe" %%A --export-png=%%A.png

inkscape.exe場所はお使いのPCの実行可能プログラムの場所と一致する必要があることに注意してください;前の2番目--export-png%%A-変換されるSVGファイルです)

  1. ダブルクリックconvert.batして実行すると、変換の結果がエコーアウトされます。

新しいファイルを表示するには、Windowsフォルダーを更新する必要があるかもしれませんが、それらはすべて元のSVGと同じ場所に作成されている必要があります。



0

特定のディレクトリ内のすべてのsvgファイルをicoファイルに変換するImageMagickベースのソリューションを次に示します。

mogrify -format ico -density 1200 -background transparent -trim -resize 256x256 -gravity center -extent 256x256 -define icon:auto-resize *.svg

説明:

  • mogrify:に似てconvertいますが、複数のファイルをバッチ処理できます。
  • -format ico:ターゲットファイル形式。.ico元のファイルを上書きする代わりにファイルを作成します(デフォルトでmogrifyが行うように)。
  • -density 1200:ImageMagickがSVGをラスタライズするターゲットピクセルサイズを指定できないため(最初にデフォルトの密度でラスタライズしてからスケーリングする)、非常に高い解像度(1200dpi)でSVGをラスタライズして、画像がされますダウンスケール 256×256の代わりに、スケールアップに。
  • -background transparent:背景は透明としてレンダリングされます。
  • -trim:画像の周囲の既存の境界線を削除します。
  • -resize 256x256:画像を拡大縮小して、縦横比を保ちながら最長辺が256ピクセルになるようにします。
  • -gravity center -extent 256x256:キャンバスを拡大し、短辺にも256pxを確保します。既存の画像は中央揃えになります。これが必要なのは、ICOファイルの基礎として正方形の画像が必要だからです。
  • -define icon:auto-resize:256x256の画像だけでなく、推奨されるすべての縮小解像度(32x32など)もICOファイルに含めます。

0

ここで与えられるほとんどの回答は、質問の希望するサイズの部分を無視します。convertSVGを「アップスケーリング」するときに満足のいく結果を得ることができませんでした。inkscapeより良い仕事をし、背景の透明度も保持します。

ユースケースに応じて、次のオプションのいずれかを使用します。

  1. 指定されたDPIでエクスポート: inscape in.svg -d 300 -e out.png
  2. 指定された幅でエクスポート(アスペクト比を維持): inscape in.svg -w 800 -e output.png
  3. 指定された高さでエクスポート(アスペクト比を維持): inscape in.svg -h 600 -e output.png

幅と高さの両方を指定しても、アスペクト比保持されないことに注意してください。

一度に多くのファイルを変換するには、ユースケースに合わせて以下を調整します(in bashまたはcompatible):

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.