สร้างความละเอียดหลายร้อยจากภาพเดียว


8

ฉันกำลังทำงานในโครงการที่ฉันต้องการภาพเดียวในความละเอียดหลายภาพ โชคดีที่ภาพมีความกว้าง / ความสูงเท่ากันและสามารถทำงานได้ดีกับความละเอียดทั้งหมดที่มีความสูงและความกว้างเท่ากันเช่น 80x80px 100x100px เป็นต้น

เห็นได้ชัดว่าฉันสามารถทำสิ่งนี้ด้วยมือใน Adobe Photoshop แต่ฉันต้องการความละเอียดหลายร้อยตัวจาก 73px ไปจนถึง 1,000px และต้องใช้เวลาเป็นจำนวนมาก ฉันได้ค้นหาเน็ตแล้วสิ่งที่ฉันได้รับก็คือเครื่องกำเนิดภาพขนาดเล็กหรือ Adobe Photoshop batch saver ซึ่งจะใช้เวลานานพอสมควร

ดังนั้นสิ่งที่นำมาสู่คำถามของฉันฉันจะสร้างความละเอียดหลายร้อยวิธีจากภาพเดียวได้อย่างรวดเร็วที่สุดทั้งใน Windows หรือ Linux


1) พวกเขามี CDN เช่น ImgIx ที่จะปรับขนาดภาพให้คุณแบบไดนามิก 2) ฉันใช้ ThumbNailer โดย Smaller Animals ($ 15) ในการประมวลผลภาพเป็นชุด คุณเพียงเรียกใช้ผ่านทางบรรทัดคำสั่งด้วย "โปรไฟล์" ที่คุณกำหนดค่าและโทรผ่านบรรทัดคำสั่ง สำหรับการแก้ปัญหาแต่ละครั้งคุณจะต้องมีโปรไฟล์แยกต่างหาก เนื่องจากภาพของคุณเป็น 1: 1 และคุณไม่ต้องการตัวเลือกการปรับขนาด "อัจฉริยะ" ฉันคิดว่า ImageMagick จะเพียงพอมากกว่า
อาทิตย์ที่

คุณสามารถใช้ภาพเวกเตอร์เดียวแทนได้หรือไม่
Anonsage

2
ฉันอยากรู้เกี่ยวกับโครงการที่จะต้องใช้หลายร้อยภาพที่มีขนาดแตกต่างกัน มันไม่เกี่ยวข้องกับคำตอบ แต่ฉันก็ยังสงสัย

2
คุณแน่ใจหรือไม่ว่าคุณต้องการภาพในความละเอียดจำนวนมาก? ลองคิดดูอีกครั้งอย่างระมัดระวังมากขึ้น พูดคุยกับคนอื่น ฉันไม่สามารถแยกแยะได้ว่ามีคดีขอบที่ไหนสักแห่งที่เป็นกรณีนี้จริง ๆ แต่ถ้าฉันต้องเดิมพันฉันจะพนันกับ "คุณกำลังทำผิด"
o0 '

@ Lohrois สิทธิ์ของคุณเราไม่ต้องการมันทั้งหมด แต่เพื่อ 30mb โดยรวม (1,000pngs) มันไม่ใช่ปัญหาใหญ่สำหรับ PNG ที่ไม่ได้ใช้
Simon Hayter

คำตอบ:


19

ฉันต้องการสร้างภาพจำนวนมากตามภาพต้นฉบับ!

เห็นได้ชัดว่าฉันสามารถทำสิ่งนี้ได้ด้วยมือใน Adobe Photoshop ... และมันต้องใช้เวลานานมาก

คุณพูดถูก ปล่อยให้คอมพิวเตอร์ทำงานซ้ำ ๆ ได้ง่าย นั่นคือสิ่งที่พวกเขาทำได้ดี ในฐานะที่เป็นบันทึกคำตอบของ Tom Ruhคุณสามารถใช้ImageMagickสำหรับสิ่งนี้

อย่างไรก็ตามมีปัญหา:

โชคดีที่ภาพมีความละเอียด4: 3และสามารถทำงานได้ดีกับความละเอียดทั้งหมดที่มีความสูงและความกว้างเท่ากันเช่น80x80px 100x100pxเป็นต้น

(เน้นที่เหมือง)

ยังไม่ชัดเจนว่าคุณต้องการความละเอียดเท่าใด -: 4: 3 ตามที่ระบุไว้หรือ 1: 1 ตามความหมาย

แต่ขึ้นอยู่กับความต้องการของคุณของ73px ขั้นต่ำและ1000px สูงสุดและhundereds มติ ; ฉันได้เขียนสคริปต์เล็กน้อยซึ่งควรครอบคลุมความเป็นไปได้มากที่สุด (รวมถึงการปรับขนาดของเหลวในโอกาสที่คุณต้องการ) ซึ่งสามารถตั้งค่าได้โดยการเปลี่ยนตัวแปรบางอย่าง

สคริปต์มีให้จาก pastebin ที่นี่เพื่อการคัดลอกที่ง่ายขึ้น :

#!/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

หมายเหตุ: บิตที่อยู่ด้านบนของ subshells สำหรับการคำนวณค่าและเช่น แต่เฮ้โฮ ตามที่ระบุไว้ที่printfสายสามารถ uncommented สำหรับความคิดของสิ่งที่เกิดขึ้นในมิฉะนั้นจะดำเนินการอย่างเงียบ ๆ โดยค่าเริ่มต้นเป็นไปตามกฎแห่งความเงียบ ภาพบางภาพจะไม่เป็นขนาดที่คำนวณอย่างแน่นอน (เช่น 193px เทียบกับ 138.54545454545454545452px) เนื่องจากคุณไม่สามารถใช้ประโยชน์ได้อย่างมีพิกเซลเศษส่วน


1
โอโหสุดยอด! เพิ่งผ่านการทดสอบและมันใช้งานได้ดีน่าเศร้า แต่สิ่งนี้สร้างปัญหาใหม่ของป้ายกำกับไฟล์เนื่องจาก 1, 2, 3, 4 ฯลฯ ไม่ได้แจ้งความละเอียดให้ฉันโดยไม่ต้องทำคณิตศาสตร์หรือตรวจสอบภาพ คุณเกิดขึ้นที่จะรู้ว่าฉันสามารถปรับตัวเข้ากับสคริปต์เพื่อให้ความละเอียดผนวกชื่อไฟล์เช่นfilename-500x500.pngแทนที่จะfilename-1.png
ไซมอนเฮย์

ดีใจที่มันทำงานเพื่อความพึงพอใจของคุณมากขึ้นหรือน้อยลง ขอบคุณสำหรับการชี้แจงฉันจะอัปเดตคำตอบด้วยชื่อไฟล์ที่มีความหมายมากขึ้น จะfilename-width.pngพอเพียง? หนึ่งในโหมด ( คงอัตราส่วนเดิม ) ไม่ได้คำนวณความสูงโดยตรงอย่างชัดเจน ฉันสามารถรับข้อมูลได้อย่างง่ายดาย (ผ่านidentify) แต่มันจะบันทึกการโทรต่อภาพเพิ่มเติมในกรณีที่อัตราส่วนภาพดั้งเดิม
bertieb

ว้าวขอบคุณที่ตอบอย่างรวดเร็ว! ความกว้างของฉันจะใช้งานได้เนื่องจากฉันได้รับหมายเลขอัตโนมัติสำหรับความสูง
Simon Hayter

เกี่ยวกับสิ่งที่ฉันหมายถึง 4: 3 คืออัตราส่วนกว้างยาวที่พบในทีวีและจอภาพ, สี่เหลี่ยมจัตุรัส .. เช่นgoogle.co.uk/และไม่ใช่กล่องจดหมาย 16: 9 เป็นต้น
Simon Hayter

1
ฉันจะต้องดาวน์โหลดมันขอบคุณ! ฟัง! .... ตำนานของคุณสคริปต์ทำงานสุดยอด! ขอบคุณสำหรับความช่วยเหลือ.
Simon Hayter

7

ตราบใดที่คุณสามารถจัดการบรรทัดคำสั่งและเขียนสคริปต์ BASH แบบง่าย ๆ ได้ คุณสามารถใช้ImageMagick


1
หากความละเอียดอยู่ในสัดส่วนภาพ 4: 3 ดังนั้นกว้าง 4 พิกเซลตลอดไปคุณจะเพิ่มขึ้นอีก 3 ภาพ นอกจากนี้ความละเอียด 80x80 หรือ 100x100 มีอัตราส่วน 1: 1 เมื่อคุณเปลี่ยนจากอัตราส่วน 4: 3 เป็นอัตราส่วน 1: 1 คุณจะต้องยืดภาพหรือครอบตัดพิกเซลส่วนเกิน ไม่แน่ใจว่ามันสำคัญหรือไม่ แต่คุณไม่สามารถเก็บความละเอียด 4: 3 ไว้เพื่อหลีกเลี่ยงปัญหานี้ได้หรือไม่
Geruta

1
รู้สึกสบายใจที่รู้ว่าวิธีแก้ปัญหาเป็นไปได้ แต่นี่ไม่ได้ตอบว่าจะทำอย่างไรให้สำเร็จ คุณสามารถขยายคำตอบด้วยตัวอย่างหรือคำแนะนำได้ไหม? ขอบคุณ
fixer1234

1) คุณสามารถใช้ convert.exe ซึ่งเป็นส่วนหนึ่งของ ImageMagic ด้วยตัวเลือก -resize: imagemagick.org/discourse-server/viewtopic.php?t=15438
Sun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.