Tạo hàng trăm độ phân giải từ một hình ảnh duy nhất


8

Tôi đang làm việc trên một dự án mà tôi cần một hình ảnh duy nhất ở nhiều độ phân giải. May mắn là hình ảnh có độ phân giải chiều rộng / chiều cao giống hệt nhau và sẽ hoạt động tốt với tất cả các độ phân giải có cùng chiều cao và chiều rộng, tức là 80x80px 100x100px, v.v.

Rõ ràng tôi có thể làm điều này bằng tay trong Adobe Photoshop nhưng tôi thực sự cần hàng trăm độ phân giải khác nhau từ 73px cho đến 1000px và điều này sẽ tốn một khoảng thời gian thủ công ngớ ngẩn. Tôi đã tìm kiếm trên mạng và tất cả những gì tôi tiếp tục nhận được là trình tạo hình thu nhỏ hoặc trình tiết kiệm hàng loạt Adobe Photoshop vẫn sẽ mất một khoảng thời gian đáng kể.

Vì vậy, điều này đưa tôi đến câu hỏi của tôi, Làm cách nào tôi có thể tạo hàng trăm độ phân giải từ một hình ảnh nhanh nhất có thể, trong Windows hoặc Linux.


1) họ có CDN như ImgIx sẽ thay đổi kích thước hình ảnh động cho bạn. 2) Tôi đã sử dụng ThumbNailer của Động vật nhỏ hơn ($ 15) để xử lý hàng loạt hình ảnh. Bạn chỉ cần chạy nó thông qua dòng lệnh với "hồ sơ" bạn cấu hình và gọi thông qua dòng lệnh. Đối với mỗi độ phân giải, bạn sẽ cần một hồ sơ riêng. Vì hình ảnh của bạn là 1: 1 và bạn không cần bất kỳ tùy chọn thay đổi kích thước "thông minh" nào, tôi nghĩ ImageMagick sẽ là quá đủ.
CN

Bạn có thể sử dụng một hình ảnh vector duy nhất thay thế?
Anonsage

2
Tôi tò mò về dự án sẽ yêu cầu hàng trăm hình ảnh giống nhau ở các kích cỡ khác nhau. Nó không liên quan đến câu trả lời, nhưng dù sao tôi cũng tò mò.

2
Bạn có SURE bạn cần một hình ảnh trong rất nhiều độ phân giải? Nghĩ về nó một lần nữa, cẩn thận hơn nhiều. Thảo luận với những người khác. Tôi không thể loại trừ có một trường hợp cạnh ở đâu đó trong trường hợp này thực sự là như vậy, nhưng nếu tôi phải đặt cược, tôi đã đặt cược vào "bạn đang làm sai".
o0 '.

@Lohro là quyền của bạn, chúng tôi không cần tất cả, nhưng với tổng số 30mb (1000pngs), đó không phải là vấn đề lớn đối với các PNG không được sử dụng.
Simon Hayter

Câu trả lời:


19

Tôi muốn tạo ra nhiều hình ảnh dựa trên một hình ảnh nguồn!

Rõ ràng là tôi có thể làm điều này bằng tay trong Adobe Photoshop ... và điều này sẽ tốn một khoảng thời gian thủ công ngớ ngẩn.

Bạn rất đúng. Hãy để máy tính làm công việc lặp đi lặp lại dễ dàng; đó là những gì họ giỏi Như câu trả lời của Tom Ruh , bạn có thể sử dụng ImageMagickcho việc này.

Tuy nhiên, có một vấn đề:

May mắn là hình ảnh có độ phân giải 4: 3 và sẽ hoạt động tốt với tất cả các độ phân giải có cùng chiều cao và chiều rộng, tức là 80x80px 100x100px, v.v.

(nhấn mạnh của tôi)

Không rõ độ phân giải bạn muốn- 4: 3 như đã nêu, hoặc 1: 1 như ngụ ý.

Tuy nhiên, dựa trên yêu cầu của bạn về tối thiểu 73pxtối đa 1000px và hàng trăm độ phân giải ; Tôi đã viết ra một kịch bản nhỏ bao gồm hầu hết các khả năng (bao gồm thay đổi kích thước chất lỏng trong trường hợp bạn muốn như vậy) có thể được đặt bằng cách thay đổi một số biến.

Script, cũng có sẵn từ pastebin ở đây để sao chép dễ dàng hơn :

#!/bin/bash
# resizer.sh - resize target image between two resolutions
# accepts file as either first argument or by setting FILEPATH variable

# SETTINGS

SMALLEST_WIDTH=73   # px
LARGEST_WIDTH=1000  # px
FILEPATH=           # set if you don't want to pass in image as argument
NUM_OF_RESOLUTIONS=100      # number of images generated; will generate between
                    # $SMALLEST_WIDTH and $LARGEST_WIDTH
RATIO=                      # set if you want to specify width/height
                    # (eg 1/1, 4/3, 16/9), blank is preserve current ratio


# NOTE: resizing to other aspect ratios may be slow/distorty:
# as per http://www.imagemagick.org/Usage/resize/#noaspect
# Seamless resizing (default) may be preferred, see:
# http://www.imagemagick.org/Usage/resize/#liquid-rescale
# but note it is slower, particularly as images get larger

LIQUID=0

# SCRIPT BELOW
# silent by default; uncomment "printf" lines for a description of what is happening
die() { printf "$@\n" 1>&2 ; exit 1; }

if [ -z "$FILEPATH" ]; then
    if [ -z "$1" ]; then die "Need to supply file to work on either as argument or by setting FILEPATH!";
    else FILE="$1";
    fi
else
    FILE="$FILEPATH"
fi

# check file exists and is regular file

if [ ! -e "$FILE" ]; then die "$FILE does not exist!"; fi
if [ ! -f "$FILE" ]; then die "$FILE is not a regular file!"; fi

i=0
step=$(echo "($LARGEST_WIDTH - $SMALLEST_WIDTH) / ($NUM_OF_RESOLUTIONS - 1)" | bc -l)
#printf "Resolution step is: %s\n-------------" "$step"
while [ $i -lt $NUM_OF_RESOLUTIONS ]; do
    # handle ratio
    WIDTH=$(echo "$SMALLEST_WIDTH+($step*$i)" | bc -l)
    if [ -z "$RATIO" ]; then
            #printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
    else
            HEIGHT=$(echo "$WIDTH * $RATIO" | bc -l)
            if [ "$LIQUID" -eq 0 ]; then
                    # Uncomment convert line for distorted ("squashed") resizing
                    #printf "convert %s -resize %sx%s\! %s\n" "$FILE" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "$FILE" -resize "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            else
                    # Liquid resizing: http://www.imagemagick.org/Usage/resize/#liquid-rescale
                    # fast aspect ration resize first, then liquid
                    #printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    #printf "%s details are now:\n %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$(identify "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}")"
                    #printf "convert %s -liquid-rescale %sx%s\! %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" -liquid-rescale "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            fi
    fi
    (( i++ ))
done

Ghi chú: Một chút trên đầu trang con để tính toán các giá trị và như vậy, nhưng hey ho. Như đã lưu ý, các printfdòng có thể không bị thiếu đối với một ý tưởng về những gì đang diễn ra, nếu không nó sẽ hoạt động âm thầm theo mặc định theo Quy tắc Im lặng . Một số hình ảnh sẽ không có kích thước chính xác như được tính toán (ví dụ: 193px so với 138.54545454545454545452px) vì bạn không thể theo cách hữu ích có các pixel phân đoạn.


1
Woohoo, tuyệt vời! chỉ cần thử nghiệm và nó hoạt động rất đáng yêu, tuy nhiên điều này tạo ra một vấn đề mới về nhãn tệp, vì 1, 2, 3, 4, v.v. không thông báo cho tôi độ phân giải mà không phải thực hiện một số phép toán hoặc bằng cách kiểm tra hình ảnh. Bạn có tình cờ biết làm thế nào tôi có thể điều chỉnh kịch bản để nối thêm độ phân giải vào tên tệp hay filename-500x500.pngkhôngfilename-1.png
Simon Hayter

Vui mừng nó hoạt động để sự hài lòng của bạn ít nhiều. Cảm ơn đã làm rõ, tôi sẽ cập nhật câu trả lời với một tên tệp mô tả nhiều hơn. Sẽ filename-width.pngđủ? Một trong các chế độ ( giữ tỷ lệ khung hình gốc ) không tính trực tiếp chiều cao rõ ràng. Tôi có thể dễ dàng có đủ thông tin (thông qua identify) nhưng nó sẽ lưu một cuộc gọi trên mỗi hình ảnh bổ sung trong các trường hợp tỷ lệ khung hình gốc.
bertieb

Woah, cảm ơn vì đã phản hồi nhanh chóng! vâng chiều rộng sẽ thực hiện công việc vì tôi tự động giả sử cùng một số cho chiều cao.
Simon Hayter

Liên quan đến những gì tôi muốn nói với tỷ lệ 4: 3 là tỷ lệ khung hình được tìm thấy trong TV và Màn hình, hình vuông .. tức là google.co.uk/ không và hộp thư 16: 9, v.v.
Simon Hayter

1
Tôi sẽ phải tải nó, cảm ơn! lắng nghe! .... một huyền thoại của bạn, kịch bản hoạt động khủng khiếp! Cảm ơn bạn cho tất cả sự giúp đỡ của bạn.
Simon Hayter

7

Miễn là bạn có thể xử lý một số dòng lệnh và viết một số kịch bản BASH đơn giản. Bạn có thể sử dụng ImageMagick


1
Nếu độ phân giải ở tỷ lệ khung hình 4: 3, thì cứ sau 4 pixel, bạn lại tăng thêm 3 pixel nữa. Ngoài ra, độ phân giải 80x80 hoặc 100x100 có tỷ lệ khung hình 1: 1. Vì bạn chuyển từ tỷ lệ 4: 3 sang tỷ lệ 1: 1, bạn sẽ phải kéo dài hình ảnh hoặc cắt các pixel thừa. Không chắc chắn nếu nó có vấn đề nhưng bạn không thể giữ độ phân giải 4: 3 của mình để tránh điều này?
Geruta 13/07/2015

1
Thật thoải mái khi biết rằng một giải pháp là có thể, nhưng điều này không trả lời làm thế nào để thực hiện nó. Bạn có thể mở rộng câu trả lời của bạn với một ví dụ hoặc một số hướng dẫn? Cảm ơn.
fixer1234

1) Bạn có thể sử dụng Convert.exe là một phần của Imagemagick với các tùy chọn -resize: imagemagick.org/discourse-server/viewtopic.php?t=15438
Sun
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.