Puncte:1

Cum să convertiți 32 MB de fișier PNG în 200 Kb fără a-și pierde culorile

drapel us

Am câteva imagini care au o dimensiune de 32 MB și vreau să le schimb dimensiunea de la 32 MB la 100 Kb sau orice dimensiune de KB fără a-i afecta culorile.

Comenzile pe care le încerc sunt:

muhammad@muhammad-mohsin:~/scans$ găsi . -iname „*.png” -exec mogrify -format jpg „*.png” {} +


muhammad@muhammad-mohsin:~/$ găsi . -type f -iname \*.png -delete


muhammad@muhammad-mohsin:~/$ găsi . -iname '*.jpg' -exec mogrify -define jpeg:extent=300kb -strip -quality 90 -scale 90% *.jpg {} +

Aici, mai întâi convertesc un PNG în JPG care îi reduc dimensiunea de la 32 Mbs la 5,8 Mbs și totul rămâne la fel, dar când folosesc a treia comandă, elimină culoarea de fundal din imagine și o face în tonuri de gri un fel de neclară.

Cu toate acestea, textul este încă lizibil, dar culorile și logo-ul de fundal nu.

Cum pot realiza acest lucru cu convert, mogrify sau orice alt instrument? Am încercat toate lucrurile posibile până acum.

Aceasta face parte din imaginea originală

Aceasta face parte din imaginea schimbată după comandă

Knud Larsen avatar
drapel by
30MB png la 300kb jpg â Exemplu : `convert Sample.png -resize 22% S300.jpg` .... atunci ai o calitate foarte buna, dar o imagine mai mica.
LearningROR avatar
drapel us
@KnudLarsen Mulțumesc pentru asta. Chiar m-a ajutat. Putem adăuga o altă caracteristică pentru a face culorile imaginii clare/luminoase etc? Folosesc: `convert image.png -resize 35% S300.jpg` și returnează dimensiunea `763Kbs`. Suntem aproape!
LearningROR avatar
drapel us
@KnudLarsen Putem un proces în lot pentru această comandă, astfel încât toate imaginile dintr-un folder și sub foldere să primească această comandă pe ele? Încerc să „găsesc”. -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +` dar asta nu funcționează.
Puncte:4
drapel om

Este din cauza modului în care funcționează compresia JPEG. Încearcă să rotunjească pixelii alăturați care sunt similari între ei la valori similare. Acest lucru provoacă pierderea detaliilor și blocaj.

Acest lucru devine mai vizibil pe măsură ce creșteți nivelul de compresie, adică exact ce faci. În plus, o faci în doi pași:

  1. Compresie fără pierderi (PNG) la cu pierderi (JPEG).
  2. Compresie cu pierderi la pierderi.

Tu vei probabil obțineți un rezultat mai bun mergând fără pierderi la cu pierderi la calitatea finală, aplicând astfel o singură compresie cu pierderi, de ex. folosind jpeg:extent=300kb -strip -quality 90 -scale 90% în prima conversie.

În plus, nu spui nimic despre dimensiunea imaginii și nivelul de detaliu. Este posibil să nu fie fezabil să o coborâți la 300 kB și să păstrați calitatea dorită.

Pentru a scăpa de petele de fundal, puteți încerca să aplicați praguri documentului dvs. într-un software de editare a imaginilor, forțând orice nuanță mai mică decât o anumită nuanță de gri să fie alb, de exemplu.

Cu toate acestea, indiferent ce faceți, comprimați dintr-un format fără pierderi de 30 MB într-un format cu pierderi de 300 kB voi duce la o calitate vizibil redusă.

LearningROR avatar
drapel us
Mulțumesc mult pentru răspunsul detaliat. Ce spuneți în acest caz după 5,8 MB de dimensiune a fișierului cu JPG-uri. Putem folosi orice instrument de compresie pentru a reduce dimensiunea un pic?
LearningROR avatar
drapel us
Am toate fișierele în PNG. Cum pot folosi `jpeg:extent=300kb -strip -quality 90 -scale 90%` o singură dată în acest caz?
vidarlo avatar
drapel om
Îl poți folosi la prima ta conversie. Si da; poti incerca cu de ex. 2 MB și va duce la un rezultat mai bun decât ținta de 300 kB.
LearningROR avatar
drapel us
Mulțumesc. Are sens. +1 pentru răspuns bun. :)
Peter Cordes avatar
drapel fr
*le codifică ca copii unul după altul.* - JPEG *doar* face cuantizarea DCT, fără intra-predicție cum ar fi „copiați blocul de la 29 de pixeli în această direcție”. Poate te gândești la cadrele h.264 / h.265 I (https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format)? Bănuiesc că un codificator JPEG care face cuantificare trellis ar putea încerca să codifice blocurile din apropiere în același mod, astfel încât pasul final de compresie fără pierderi ar putea economisi mai mulți biți?
Peter Cordes avatar
drapel fr
Sau poate vrei să spui la o scară foarte locală, dorința de a rotunji componentele DCT de înaltă frecvență la zero, făcând pixelii adiacenți mai asemănători. Acel efect de pixeli similari *nu* este rezultatul codificării lor ca copii unul altuia, ci de fapt al codificării cu coeficienți de frecvență spațială în mare parte mici.
vidarlo avatar
drapel om
@PeterCordes Mulțumesc pentru corectare :)
Peter Cordes avatar
drapel fr
„*încearcă să rotunjească pixelii alăturați care sunt similari între ei la valori similare*” încă nu funcționează de fapt. Asta poate fi o parte din rezultat, dar nu este atât de simplu. Compresia cu pierderi JPEG are loc în domeniul frecvenței după [un DCT 8x8](https://en.wikipedia.org/wiki/Discrete_cosine_transform#Compression_artefacts), nu în termeni de pixeli adiacenți reali. Deci, puteți obține [artefacte „sunet”](https://en.wikipedia.org/wiki/Ringing_artifacts) în jurul marginilor ascuțite, iar procesarea separată a blocurilor de 8x8 este motivul pentru care JPEG-urile de calitate scăzută devin blocate.
Peter Cordes avatar
drapel fr
Consultați, de asemenea, [Două imagini .jpg exact aceleași, cu o imagine mai mare de două ori dimensiunea fișierului față de cealaltă - De ce?](https://photo.stackexchange.com/a/125291) pentru mai multe descriere a modului în care se comprimă JPEG și ceea ce face ca unele imagini să fie mai greu sau mai ușor de comprimat fără distorsiuni semnificative. (Am scris acel răspuns cu detalii tehnice, dar vizat un public care nu știa deja cum funcționează compresia imaginii.)
Puncte:2
drapel by

incerc găsi . -iname '*.png' -exec convert -redimensionare 60% -calitate 60 "*.jpg" {} + dar asta nu merge.

Ref. https://superuser.com/questions/71028/batch-converting-png-to-jpg-in-linux

$ ls -1 *.png | xargs -n 1 bash -c 'convert -quality 60 "$0" "${0%.*}.jpg"'

Convertește exemplul meu 31MB.png în 1.4MB.jpg. ... Poate fi necesar să repetați cu de ex. $ ls -1 *.PNG | ... etc.

Ref. Comentariu de @steeldriver: „Puțin mai bine este xargs -d '\n' -n 1 "

LearningROR avatar
drapel us
Mulțumesc, domnule Knud. Am făcut deja asta cu `find . -iname '*.png' -exec mogrify -redimensionare 60% -calitate 60 -format jpg *.png {} +` dar accept și vot favorabil răspunsul dvs. pentru că m-a pus în direcția corectă.
drapel hr
Rețineți că `ls -1 | xargs -n 1` se va întrerupe dacă oricare dintre numele fișierelor conține spații albe. Puteți să o faceți *puțin* mai bună folosind `xargs -d '\n' -n 1` care va funcționa cu excepția numelor de fișiere care conțin linii noi - le puteți gestiona și pe acestea folosind delimitatori nul, de ex. `printf '%s\0' *.png | xargs -0 -n 1 ... `. Cu toate acestea, din moment ce forkezi un nou shell bash pentru fiecare fișier, mă întreb dacă totul ar fi la fel de ușor de realizat folosind o buclă shell `for f în *.png; face ... "$f" "${f%.*}.jpg"; terminat`
Knud Larsen avatar
drapel by
@steeldriver: OK, `ls -1` etc. etc. este doar un set posibil de opțiuni. Pot adăuga sugestia ta la răspuns.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.