Làm thế nào để chỉnh lại một số hình ảnh với cùng kích thước


7

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?

nhập mô tả hình ảnh ở đây


Điều này là có thể (gợi ý: xem -bordertrong phần "Toán tử hình ảnh" trong man 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 perl Image::Magick, tôi có thể cung cấp một câu trả lời .
goldilocks

Bạn có biết kích thước lớn nhất trước?
Jasper

@ TAFKA'goldilocks 'bạn không thực sự cần một kịch bản.
terdon

@terdon Đó là một "lót" lố bịch vô lý nếu trước tiên bạn cần lặp lại tất cả các hình ảnh để tìm hình học lớn nhất.
goldilocks

@ TAFKA'goldilocks 'đúng, nhưng tôi cho rằng chỉ cần thực hiện một lần hoặc OP sẽ biết kích thước trước khi ra tay.
terdon

Câu trả lời:


10

Đ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, *.jpegvv:

#!/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 -eset +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.

Cập nhật

Bây giờ với awkkịch bản xấu hổ đạo văn từ câu trả lời của @ terdon .


1
Tôi sẽ cho bạn +1 vì "không biết xấu hổ" nhưng tôi đã nâng cấp bạn trước đó (và dù sao đó cũng là đề xuất của bạn) :)
terdon

6

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 mogrifytừ 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 RGBlà 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; 

TIL lệnh "tập tin", tốt đẹp! Nhưng dòng này có hoạt động để tìm ra chiều rộng lớn nhất và chiều cao dễ dàng không? Có lẽ bạn nên sắp xếp kích thước x và y riêng biệt.
Jasper

@Jasper thực sự, đó chỉ là một bản hack, quick'n Dirt®.
terdon

+1 Ít nhất là cung cấp một số bước cơ bản;) @Jasper bạn cũng nhận được phiếu bầu của tôi, BTW.
goldilocks

@ TAFKA'goldilocks 'Tôi cúi đầu trước bàn thờ hiệu quả, xem chỉnh sửa. Vẫn không có kịch bản: P.
terdon

1
@Tetsu, câu trả lời của tôi sẽ hoạt động với tất cả các loại hình ảnh mà ImageMagick có thể xử lý.
Graeme

6

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 blackphầ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".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.