Điểm:1

Cách chuyển đổi tệp PNG 32MB thành 200Kbs mà không làm mất màu của tệp

lá cờ us

Tôi có một vài hình ảnh có kích thước 32MB và tôi muốn thay đổi kích thước của chúng từ 32MB thành 100Kbs hoặc bất kỳ kích thước KB nào mà không ảnh hưởng đến màu sắc của hình ảnh.

Các lệnh tôi đang thử là:

muhammad@muhammad-mohsin:~/scans$ find . -iname '*.png' -exec mogrify -format jpg "*.png" {} +


muhammad@muhammad-mohsin:~/$ tìm . -type f -iname \*.png -delete


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

Ở đây, đầu tiên tôi chuyển đổi PNG sang JPG để giảm kích thước của nó từ 32Mbs xuống 5,8Mbs và mọi thứ vẫn như cũ nhưng khi tôi sử dụng lệnh thứ 3, nó sẽ loại bỏ màu nền trong hình ảnh và làm cho nó bị mờ theo thang độ xám.

Tuy nhiên, văn bản vẫn có thể đọc được nhưng màu sắc và logo nền thì không.

Làm cách nào tôi có thể đạt được điều này bằng chuyển đổi, mogrify hoặc bất kỳ công cụ nào khác? Tôi đã thử mọi thứ có thể cho đến nay.

Đây là một phần của hình ảnh gốc

Đây là một phần của hình ảnh đã thay đổi sau lệnh

Knud Larsen avatar
lá cờ by
30MB png thành 300kb jpg â Ví dụ : `convert Sample.png -resize 22% S300.jpg` .... thì bạn có chất lượng rất tốt, nhưng hình ảnh nhỏ hơn.
LearningROR avatar
lá cờ us
@KnudLarsen Cảm ơn vì điều đó. Thực sự đã giúp tôi. Chúng tôi có thể thêm một số tính năng khác để làm cho màu sắc hình ảnh sắc nét/sáng, v.v. không? Tôi đang sử dụng: `convert image.png -resize 35% S300.jpg` và nó trả về kích thước `763Kbs`. Chúng tôi đang ở gần!
LearningROR avatar
lá cờ us
@KnudLarsen Chúng tôi có thể xử lý hàng loạt cho lệnh này để tất cả các hình ảnh trong một thư mục và các thư mục con sẽ nhận được lệnh này trên chúng không? Tôi đang cố gắng `tìm . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +` nhưng điều đó không hoạt động.
Điểm:4
lá cờ om

Đó là do cách nén JPEG hoạt động. Nó cố gắng làm tròn các pixel liền kề tương tự nhau thành các giá trị tương tự. Điều này gây mất chi tiết, và khối.

Điều này trở nên đáng chú ý hơn khi bạn tăng mức độ nén, đó là chính xác Bạn đang làm gì vậy. Ngoài ra, bạn đang thực hiện theo hai bước:

  1. Nén không mất dữ liệu (PNG) sang không mất dữ liệu (JPEG).
  2. Nén mất dữ liệu thành mất dữ liệu.

Bạn sẽ có thể có được kết quả tốt hơn bằng cách chuyển từ lossless sang lossy ở chất lượng cuối cùng, do đó chỉ áp dụng nén lossy một lần, ví dụ: sử dụng jpeg:extent=300kb -strip -quality 90 -scale 90% trong lần chuyển đổi đầu tiên.

Hơn nữa, bạn không nói gì về kích thước của hình ảnh và mức độ chi tiết. Có thể không khả thi để giảm xuống 300kB và giữ nguyên chất lượng mong muốn.

Để loại bỏ các vệt nền, bạn có thể thử áp dụng các ngưỡng cho tài liệu của mình trong một số phần mềm chỉnh sửa hình ảnh, chẳng hạn như buộc bất kỳ thứ gì có ít hơn một sắc xám nhất định thành màu trắng.

Tuy nhiên, bất kể bạn làm gì, việc nén từ định dạng không mất dữ liệu 30MB sang định dạng mất dữ liệu 300kB sẽ dẫn đến chất lượng giảm rõ rệt.

LearningROR avatar
lá cờ us
Cảm ơn rất nhiều vì phản hồi chi tiết. Bạn nói gì trong trường hợp này sau kích thước tệp 5,8 MB với JPG. Chúng tôi có thể sử dụng bất kỳ công cụ nén nào để làm cho kích thước thấp hơn một chút không?
LearningROR avatar
lá cờ us
Tôi có tất cả các tệp trong PNG. Làm cách nào tôi có thể sử dụng `jpeg:extent=300kb -strip -quality 90 -scale 90%` chỉ một lần trong trường hợp này?
vidarlo avatar
lá cờ om
Bạn có thể sử dụng nó trong lần chuyển đổi đầu tiên của mình. Và vâng; bạn có thể thử với ví dụ: 2MB và nó sẽ dẫn đến kết quả tốt hơn so với mục tiêu 300kB.
LearningROR avatar
lá cờ us
Cảm ơn bạn. Có ý nghĩa. +1 cho phản hồi tốt. :)
Peter Cordes avatar
lá cờ fr
*mã hóa chúng dưới dạng bản sao của nhau.* - JPEG *chỉ* thực hiện lượng tử hóa DCT, không có dự đoán bên trong như "sao chép khối từ 29 pixel theo hướng này". Có thể bạn đang nghĩ đến các khung hình h.264/h.265 I (https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format)? Tôi đoán một bộ mã hóa JPEG thực hiện lượng tử hóa dạng lưới có thể cố gắng mã hóa các khối gần đó theo cùng một cách để bước nén không mất dữ liệu cuối cùng có thể tiết kiệm được nhiều bit hơn?
Peter Cordes avatar
lá cờ fr
Hoặc có thể ý bạn là ở quy mô rất cục bộ, muốn làm tròn các thành phần DCT tần số cao về 0, làm cho các pixel liền kề giống nhau hơn. Hiệu ứng pixel tương tự đó *không phải* là kết quả của việc mã hóa chúng theo nghĩa đen dưới dạng bản sao của nhau, mà thực tế là mã hóa với hầu hết các hệ số tần số không gian thấp.
vidarlo avatar
lá cờ om
@PeterCordes Cảm ơn bạn đã sửa :)
Peter Cordes avatar
lá cờ fr
"* cố gắng làm tròn các pixel liền kề tương tự nhau thành các giá trị tương tự *" vẫn không phải là cách nó thực sự hoạt động. Đó có thể là một phần của kết quả, nhưng nó không đơn giản như vậy. Nén mất dữ liệu của JPEG xảy ra trong miền tần số sau [một DCT 8x8](https://en.wikipedia.org/wiki/Discittle_cosine_transform#Compression_artifacts), chứ không phải theo các pixel liền kề thực tế. Vì vậy, bạn có thể nhận được [tạo tác "đổ chuông"](https://en.wikipedia.org/wiki/Ringing_artifacts) xung quanh các cạnh sắc nét và quá trình xử lý khối 8x8 riêng biệt là lý do khiến JPEG chất lượng thấp bị vón cục.
Peter Cordes avatar
lá cờ fr
Xem thêm [Hai hình ảnh .jpg CHÍNH XÁC giống nhau với một hình ảnh lớn hơn gấp đôi kích thước tệp của hình ảnh kia - Tại sao?](https://photo.stackexchange.com/a/125291) để biết thêm mô tả về cách JPEG nén và điều gì làm cho một số hình ảnh khó nén hơn hoặc dễ dàng hơn mà không bị biến dạng đáng kể. (Tôi đã viết câu trả lời đó với các chi tiết kỹ thuật, nhưng nhằm vào đối tượng chưa biết cách thức hoạt động của tính năng nén hình ảnh.)
Điểm:2
lá cờ by

tôi đang cố gắng tìm thấy . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} + nhưng điều đó không làm việc.

Tham khảo 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"'

Chuyển đổi ví dụ của tôi 31MB.png thành 1.4MB.jpg . ... Bạn có thể phải lặp lại với e.g. $ ls -1 *.PNG | ... vân vân.

Tham khảo nhận xét của @steeldriver: "tốt hơn một chút là xargs -d '\n' -n 1 "

LearningROR avatar
lá cờ us
Cảm ơn ông Knud. Tôi đã làm điều đó với `find. -iname '*.png' -exec mogrify -resize 60% -quality 60 -format jpg *.png {} +` nhưng chấp nhận và nâng cao câu trả lời của bạn để đưa tôi đi đúng hướng.
lá cờ hr
Lưu ý rằng `ls -1 | xargs -n 1` sẽ bị hỏng nếu bất kỳ tên tệp nào chứa khoảng trắng. Bạn có thể làm cho nó *tốt hơn một chút* bằng cách sử dụng `xargs -d '\n' -n 1` sẽ hoạt động ngoại trừ tên tệp chứa dòng mới - bạn cũng có thể xử lý chúng bằng cách sử dụng dấu phân cách null cũ. `printf '%s\0' *.png | xargs -0 -n 1 ... `. Tuy nhiên, vì bạn đang tạo một trình bao bash mới cho mọi tệp, tôi tự hỏi liệu toàn bộ điều này có được thực hiện dễ dàng như vậy không bằng cách sử dụng vòng lặp trình bao `for f in *.png; làm ... "$f" "${f%.*}.jpg"; xong`
Knud Larsen avatar
lá cờ by
@steeldriver: OK, `ls -1`, v.v. chỉ là một bộ tùy chọn khả thi. Tôi có thể thêm đề xuất của bạn vào câu trả lời.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.