Tôi có một số tập tin hình ảnh trong một thư mục. Những hình ảnh này có kích thước tương tự và có cùng màu nền.
Làm cách nào để tạo tất cả các hình ảnh có cùng kích thước bằng cách thêm nền như hình ảnh đính kèm này?
Tôi có một số tập tin hình ảnh trong một thư mục. Những hình ảnh này có kích thước tương tự và có cùng màu nền.
Làm cách nào để tạo tất cả các hình ảnh có cùng kích thước bằng cách thêm nền như hình ảnh đính kèm này?
Câu trả lời:
Điều này sẽ làm việc với tất cả các loại hình ảnh mà ImageMagick có thể xử lý mà không cần phải xác định *.png
, *.jpg
, *.jpeg
vv:
#!/bin/bash
images=$(identify -format '%f\n' * 2>/dev/null)
IFS=$'\n'
set -e
max_dims=$(
identify -format '%w %h\n' $images 2>/dev/null |
awk '($1>w){w=$1} ($2>h){h=$2} END{print w"x"h}'
)
orig_dir=originals_$(date +%Y-%m-%d_%T)
mkdir "$orig_dir"
mv -- $images "$orig_dir"
cd "$orig_dir"
set +e
for image in $images; do
convert -- "$image" -gravity Center -extent "$max_dims" "../$image"
done
Điều này sẽ di chuyển các hình ảnh gốc vào một thư mục ngày trong trường hợp kết quả không mong muốn. Ngoài ra, điều này sẽ thất bại nếu vì bất kỳ lý do gì, các tệp hình ảnh có dòng mới trong tên của chúng.
Kịch bản này có thể làm với một số thông báo lỗi khác để đưa ra một dấu hiệu hữu ích nếu có gì sai. Nhưng hiện tại nếu có bất kỳ lỗi nào khi di chuyển hình ảnh (mọi thứ giữa set -e
và set +e
), tập lệnh sẽ thoát. Hy vọng rằng điều này sẽ tránh làm thiệt hại không thể đảo ngược.
Bây giờ với awk
kịch bản xấu hổ đạo văn từ câu trả lời của @ terdon .
Miễn là bạn chọn kích thước mục tiêu lớn hơn hình ảnh lớn nhất của mình, bạn sẽ ổn với những điều sau:
mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png
Lệnh trên sẽ thay đổi tập tin gốc , bạn có thể muốn sao lưu trước khi chạy nó. Nó sử dụng mogrify
từ ImageMagick để thay đổi kích thước tất cả các png trong thư mục hiện tại thành 200x200px ( -extent 200x200
) bằng cách thêm một nền trắng ( -background black
) và căn giữa hình ảnh ( -gravity Center
). Các -colorspace RGB
là cần thiết để tránh các lỗi như
mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present `emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754.
Để đảm bảo bạn không mất bất kỳ dữ liệu hình ảnh nào, hãy đảm bảo rằng kích thước bạn sử dụng lớn hơn hoặc lớn bằng hình ảnh lớn nhất bạn có. Để có được điều đó nhanh chóng, hãy thử:
file *png | awk -F, '{print $2}' | sort -nu
Điều đó sẽ in kích thước của tất cả các hình ảnh được sắp xếp và bạn có thể dễ dàng tìm thấy lớn nhất.
Để xoa dịu goldilocks (: P), bạn có thể tự động hóa toàn bộ quá trình:
dimensions=$(file *png | cut -d, -f 2 | sort -u |
awk '($1>w){w=$1}($3>h){h=$3}END{print w"x"h}') &&
mogrify -gravity Center -extent $dimensions -background white -colorspace RGB *png;
Tôi đã nắm lấy cơ hội để cải thiện kỹ năng bash của mình và nghĩ ra điều này:
#!/bin/bash
maxx=0
maxy=0
# find largest dimension
for file in *.jpg ; do
dim=$(identify "$file" | awk '{ print $3 }')
xdim=$(echo $dim | cut -f1 -dx)
ydim=$(echo $dim | cut -f2 -dx)
if [ $xdim -gt $maxx ] ; then
maxx=$xdim
fi
if [ $ydim -gt $maxy ] ; then
maxy=$ydim
fi
done
mkdir bordered
# resize and store new images in new folder
for file in *.jpg ; do
dim=$(identify "$file" | awk '{ print $3 }')
xdim=$(echo $dim | cut -f1 -dx)
ydim=$(echo $dim | cut -f2 -dx)
xborder=$(( ($maxx - $xdim ) / 2 ))
yborder=$(( ($maxy - $ydim ) / 2 ))
convert "$file" -bordercolor black -border ${xborder}x${yborder} "bordered/$file"
done
Điều này nên thực hiện mẹo: trước tiên, vòng lặp trên tất cả các tệp (thay đổi theo nhu cầu của bạn) để tìm chiều rộng và chiều cao lớn nhất và sau đó lặp lại để thêm đường viền yêu cầu (thay đổi -bordercolor black
phần cho phù hợp với nhu cầu của bạn). Các tập tin mới được lưu trữ trong thư mục "giáp".
-border
trong phần "Toán tử hình ảnh" trongman convert
). Tuy nhiên, bạn cần một chương trình ngắn để thực hiện điều này và tôi sẽ không viết nó bằng vỏ, vì vậy nếu bạn sẵn sàng chấp nhận câu trả lời bằng cách sử dụng perlImage::Magick
, tôi có thể cung cấp một câu trả lời .