![32MBのPNGファイルを色を失わずに200KBに変換する方法](https://rvso.com/image/1070945/32MB%E3%81%AEPNG%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%89%B2%E3%82%92%E5%A4%B1%E3%82%8F%E3%81%9A%E3%81%AB200KB%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
32MB のサイズの画像がいくつかあるのですが、色に影響を与えずに、そのサイズを 32MB から 100KB または任意の KB に変更したいと考えています。
私が試しているコマンドは次のとおりです:
muhammad@muhammad-mohsin:~/scans$ find . -iname '*.png' -exec mogrify -format jpg "*.png" {} +
muhammad@muhammad-mohsin:~/$ find . -type f -iname \*.png -delete
muhammad@muhammad-mohsin:~/$ find . -iname '*.jpg' -exec mogrify -define jpeg:extent=300kb -strip -quality 90 -scale 90% *.jpg {} +
ここでは、まず PNG を JPG に変換してサイズを 32 MB から 5.8 MB に縮小し、すべて同じままですが、3 番目のコマンドを使用すると、画像の背景色が削除され、グレースケールのようなぼやけた画像になります。
ただし、テキストは判読可能ですが、色と背景のロゴは判読できません。
convert、mogrify、またはその他のツールを使用してこれをどのように実現できますか? これまで、可能なことはすべて試しました。
答え1
これは JPEG 圧縮の仕組みによるものです。JPEG 圧縮では、互いに類似する隣接するピクセルを同様の値に丸めようとします。これにより、詳細が失われ、ブロック状になります。
これは圧縮レベルを上げるとより顕著になります。その通り何をしているか。さらに、2 つのステップで実行しています。
- ロスレス (PNG) からロスレス (JPEG) への圧縮。
- 非可逆圧縮から非可逆圧縮へ。
あなたはするであろうおそらく最終品質でロスレスからロッシーに移行し、ロッシー圧縮を 1 回だけ適用する (たとえばjpeg:extent=300kb -strip -quality 90 -scale 90%
最初の変換で使用する) ことで、より良い結果が得られます。
さらに、画像のサイズと詳細レベルについては何も言及されていません。 300kB までサイズを縮小して、望ましい品質を維持するのは現実的ではないかもしれません。
背景の斑点を取り除くには、画像編集ソフトウェアでドキュメントにしきい値を適用し、たとえば、特定のグレーの色合い未満のものを強制的に白にするなどの方法があります。
しかし、どんなことをしても、30MBのロスレス形式から300KBのロスレス形式に圧縮すると意思目に見えて品質が低下します。
答え2
試しているのです
find . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +
が、うまくいきません。
参照https://superuser.com/questions/71028/linux でバッチ変換する png から jpg へ
$ ls -1 *.png | xargs -n 1 bash -c 'convert -quality 60 "$0" "${0%.*}.jpg"'
私の例の 31MB.png を 1.4MB.jpg に変換します。... たとえば、などを繰り返す必要がある場合があります$ ls -1 *.PNG | ...
。
@steeldriver によるコメントを参照: 「少しだけ良いのはxargs -d '\n' -n 1
」