web-dev-qa-db-ja.com

Nautilus-Actionsで品質を変更するためにJPG画像をバッチ処理する方法は?

まず、これを読んで助けてくれてありがとう。アドバイスをいただければ幸いです。

Nautilus-Actionsを使用して、カスタムコンテキストメニューのアクションを追加して、JPGイメージのコピーを作成し、イメージのサイズを維持しながら品質(およびファイルサイズ)を削減します。

たとえば、2.3 MB(2 261 588バイト)のファイルサイズに関する画像のプロパティを含むこの画像と、

enter image description here

そして、GIMP 2.8でファイルを開いてコピーをエクスポートし、JPGエクスポートダイアログボックスを使用して、次のスクリーンショットに示すように画像の品質を30%に下げた後:

enter image description here

画像のコピーで次の画像のプロパティを取得します(251.8 kB(251 797バイト)ファイルサイズ):

enter image description here

今。

Nautilusで多数のファイルを選択し、これらの選択したファイルのいずれかを右クリックして適切なNautilusアクションアクションを選択することにより、コンテキストメニューで同じ動作を再現するために、Nautilusアクションを使用して多くの画像をバッチ処理します。その結果、元の画像と同じサイズの画像を含むファイルが作成されますが、もちろん品質は低下し、ファイルサイズは少し大きくなります(275.3 kB(275 265バイト)ファイルサイズ)が、それは私にとって大きな問題ではありません。

問題

複数の画像ファイルをバッチ処理しようとすると、最初のファイル名がそれぞれ異なる画像を含む複数のファイル名に複製されます。次の一連のコマンドで設定したプロパティで:

enter image description here

基本的に、各Nautilusアクションは次のパラメーターを使用しています。

コマンド:convert

  • から(imagemagick)

パラメータ:%F.jpg -quality 80%% %F-80q.jpg

  • 次のように解釈されます:convert path/to/file1.mid.jpg -quality=80% path/to/file1.mid-80q.jpg

作業ディレクトリ:%d

  • 自分自身を説明した。

そのため、結果は次のスクリーンショットで見ることができます。

enter image description here

ここでは、各ファイルが異なるファイルで処理されているのを見ることができますが、コピーされたファイルに新しい名前を割り当てるために最初のファイル名だけが使用されます。私は次のような結果を望みます:

File1.jpg === File1-80q.jpg
File2.jpg === File2-80q.jpg
File3.jpg === File3-80q.jpg
File4.jpg === File4-80q.jpg

等々...

Phatchを使用してこのようなタスクを実行しましたが、希望するのは、選択したファイルを右クリックし、1回のアクションで処理することです。

これを行うためのより良い方法はありますか?または...すでにやっていることを何らかの形で改善できますか?

ご支援ありがとうございました。

追伸 フォルダ構造を保持しながら画像を白黒にバッチ変換する方法 および SVGをPNGにバッチエクスポートする方法はありますか? ですが、これは端末から実行しますが、コンテキストメニューから実行します。この演習で何かを省略している場合は、遠慮なくお知らせください!とても感謝しています。ありがとうございました!

編集

muruの答え を使用した後、そのソリューションが期待どおりに部分的に機能することがわかりました。

より具体的には、ファイル名の問題を解決します。それにもかかわらず、適切なconvert file.jpg -quality 30%コマンドを実行することでファイルサイズを小さくすることも期待していましたが、次の図に示すように、ファイルサイズを大きくしています。

enter image description here

muru's answer で見られるパラメーターに追加すべきものがあるかどうか、誰もが知っていますか?この問題に関するヘルプを提供するためのあなたの努力に感謝します。

更新

これは、圧縮の問題がどこにあるかを見た人に知らせるためだけに書いています。私が圧縮しようとしたファイルはすでに十分に圧縮されていたので( muruの答え で述べたように):

プロセスは、何も得ずにオーバーヘッドを追加するだけでした。

%Fは選択したすべてのファイルの名前に置き換えられるため、そのようなコマンドで%Fを2回使用することはできません。たとえば、パラメータ-c 'printf "%%s\n" "$@" > foo' %F %Fを持つshのコマンドは、選択されたすべてのファイルの名前を2回使用して、fooという名前のファイルを作成します。したがって、実際に実行されるconvertコマンドは次のとおりです。

convert file1.jpg file2.jpg ... -quality 80% file1.jpg file2.jpg ... fileN.jpg-80q.jpg

そして、最後のファイルが出力ファイル名として使用されるため、それだけが重要になります。

できることは、コマンドをbash -cでラップし、forループを実行することです。

bash -c 'for i; do convert "$i" -quality 80% "${i/%.jpg/-80q.jpg}"; done'

(私はすべてのファイルが.jpgで終わると仮定しています)

アクションでは、コマンドとしてbashを使用し、パラメーターを使用します。

-c 'for i; do convert "$i" -quality 80%% "${i/%%.jpg/-80q.jpg}"; done' - %F

これをより複雑にして拡張機能を処理することができます。この時点で、アクションをスキップしてスクリプトを使用することもできます。

2
muru