32MBのPNGファイルを色を失わずに200KBに変換する方法

32MBのPNGファイルを色を失わずに200KBに変換する方法

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 つのステップで実行しています。

  1. ロスレス (PNG) からロスレス (JPEG) への圧縮。
  2. 非可逆圧縮から非可逆圧縮へ。

あなたはするであろうおそらく最終品質でロスレスからロッシーに移行し、ロッシー圧縮を 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

関連情報