Câu trả lời:
Đặt cược tốt nhất của bạn sẽ là sử dụng Imagemagick
Tôi không phải là một chuyên gia trong việc sử dụng thực tế, nhưng tôi biết bạn có thể làm bất cứ điều gì liên quan đến hình ảnh này!
Một ví dụ là:
convert image.png image.jpg
và nó sẽ giữ nguyên bản gốc cũng như tạo ra hình ảnh được chuyển đổi. Đối với lô. Tôi nghĩ rằng bạn cần sử dụng công cụ Mogrify (từ cùng một dòng lệnh khi trong hình ảnh tưởng tượng). Hãy nhớ rằng điều này ghi đè lên những hình ảnh cũ.
Lệnh là:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
tôi có 2 tệp và file img.*
báo cáo một png, bản gốc chưa được xử lý và một tệp jpeg mới. Vì vậy, mogrify
không không ghi đè lên file gốc trong trường hợp này.
mogrify
tài liệu: " Công cụ này tương tự như convert
ngoại trừ tệp ảnh gốc bị ghi đè (trừ khi bạn thay đổi hậu tố tệp bằng tùy chọn -format ) với bất kỳ thay đổi nào bạn yêu cầu. "
Tôi có một vài giải pháp.
Giải pháp đơn giản nhất giống như hầu hết đã được đăng. Một bash đơn giản cho vòng lặp.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Vì một số lý do, tôi có xu hướng tránh các vòng lặp trong bash, vì vậy đây là một cách tiếp cận xargs unixy hơn, sử dụng bash cho việc xáo trộn tên.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Cái tôi dùng Nó sử dụng GNU Parallel để chạy nhiều công việc cùng một lúc, giúp bạn tăng hiệu suất. Nó được cài đặt theo mặc định trên nhiều hệ thống và gần như chắc chắn trong repo của bạn (đây là một chương trình tốt để có xung quanh).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Số lượng công việc mặc định theo số lượng quy trình bạn có. Tôi thấy việc sử dụng CPU tốt hơn bằng cách sử dụng 3 công việc trên hệ thống lõi kép của mình.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Và nếu bạn muốn một số thống kê (ETA, công việc đã hoàn thành, thời gian trung bình cho mỗi công việc ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Ngoài ra còn có một cú pháp thay thế nếu bạn đang sử dụng GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
Và một cú pháp tương tự cho một số phiên bản khác (bao gồm cả debian).
parallel convert '{}' '{.}.jpg' -- *.png
done
ở cuối vòng lặp đó. Ngoài ra, đối với các công cụ song song, bạn có thể tránh sử dụng công cụ đó ls
và đường ống có cấu trúc như: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(xem tại đây )
ls
phương pháp này vì nó có ý nghĩa hơn đối với tôi.
--
chứ không phải :::
) - và thậm chí sau đó, nó bực bội thiếu một số tính năng của GNU song song.
Các convert
lệnh tìm thấy trên nhiều bản phân phối Linux được cài đặt như một phần của bộ ứng dụng ImageMagick. Đây là mã bash để chạy convert
trên tất cả các tệp PNG trong một thư mục và tránh vấn đề mở rộng kép đó:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Đối với những người chỉ muốn các lệnh đơn giản nhất:
Chuyển đổi và giữ các tệp gốc:
mogrify -format jpg *.png
Chuyển đổi và xóa các tập tin gốc:
mogrify -format jpg *.png && rm *.png
Có mặt muộn trong bữa tiệc, nhưng chỉ để giải tỏa tất cả sự nhầm lẫn cho một người có thể không thoải mái lắm với cli, đây là một tài liệu tham khảo và giải thích siêu ngớ ngẩn.
Thư mục mẫu
bar.png
foo.png
foobar.jpg
Giữ tất cả các tệp png gốc cũng như tạo các tệp jpg.
mogrify -format jpg *.png
Kết quả
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Giải trình
-format
tùy chọn. (Từ trang web : This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
)- format
tùy chọn xác định rằng bạn sẽ được thay đổi định dạng, và các số tiếp theo cần phải được loại (trong trường hợp này, jpg).*.png
là các tệp đầu vào (tất cả các tệp kết thúc bằng .png).Chuyển đổi tất cả các tệp png thành jpg, loại bỏ bản gốc.
mogrify -format jpg *.png && rm *.png
Kết quả
bar.jpg
foo.jpg
foobar.jpg
Giải trình
&&
là một toán tử boolean. Nói ngắn gọn:
0
có nghĩa là không có lỗi.&&
thực hiện đánh giá ngắn mạch , phần bên phải sẽ chỉ được thực hiện nếu không có lỗi . Điều này rất hữu ích vì bạn có thể không muốn xóa tất cả các tệp gốc nếu có lỗi khi chuyển đổi chúng.rm
lệnh xóa file.Bây giờ đây là một số goodies cho những người đang cảm thấy thoải mái với cli.
Nếu bạn muốn một số đầu ra trong khi nó chuyển đổi tập tin:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Chuyển đổi tất cả các tệp png trong tất cả các thư mục con và cung cấp đầu ra cho mỗi tệp:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Chuyển đổi tất cả các tệp png trong tất cả các thư mục con, đặt tất cả các jpg kết quả vào all
thư mục, đánh số chúng, xóa các tệp png gốc và hiển thị đầu ra cho mỗi tệp khi nó diễn ra:
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
while read
phần đó (thay thế hoặc xóa tất cả cùng nhau) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
tệp kết quả bên cạnh các *.png
tệp gốc , cho thấy cách giảm kích thước / chất lượng tệp và không bị hỏng do có bất kỳ ký tự lẻ nào trong thư mục hoặc tên tệp.
giải pháp nhanh chóng của tôi
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Đó tránh được hoàn toàn không cần thiết ls
, grep
và sed
các cuộc gọi (và echo
, nhưng IIRC đó là một bash BUILTIN và như vậy sẽ không có / rất ít tác động hiệu suất), và được thoát khỏi hai ống và hai subshells, và bao gồm ít gõ. Nó thậm chí còn dễ mang theo hơn một chút, vì không phải tất cả các phiên bản ls
đều an toàn để phân tích.
Nhiều năm đã quá muộn, có một tiện ích png2jpeg dành riêng cho mục đích này, mà tôi là tác giả.
Điều chỉnh mã bởi @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Để xử lý hàng loạt:
for img in *.png; do
convert "$img" "$img.jpg"
done
Bạn sẽ kết thúc với tên tệp như image1.png.jpg.
Điều này sẽ làm việc trong bash, và có thể bourne. Tôi không biết về các shell khác, nhưng sự khác biệt duy nhất có thể là cú pháp vòng lặp.
Đây là những gì tôi sử dụng để chuyển đổi khi các tệp trải rộng trên một thư mục. Bản gốc của tôi là TGA to PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Khái niệm này là find
các tệp bạn cần, loại bỏ phần mở rộng sau đó thêm lại vào xargs
. Vì vậy, đối với PNG sang JPG, bạn sẽ thay đổi các tiện ích mở rộng và thực hiện thêm một điều nữa để xử lý các kênh alpha cụ thể là đặt nền (trong ví dụ này là màu trắng, nhưng bạn có thể thay đổi nó) sau đó làm phẳng hình ảnh
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg