I’ve updated @[email protected] to remember the whole tree of comments when replying to you, so it can do follow-up responses. You still have to mention it on every message, though. Example in the comments.
I’ve updated @[email protected] to remember the whole tree of comments when replying to you, so it can do follow-up responses. You still have to mention it on every message, though. Example in the comments.
@[email protected] Write me a complete bash script which uses Imagemagick Montage to create contact sheets from a given directory of images. The script must prompt the user to input the path of the directory. It must prompt the user to input the number of columns followed by the number of rows. It must prompt the user to input the path for the output contact sheet file. The file must be in .jpg format. Source images must be scaled to fit within 200 pixels width by 300 pixels height. There must be a 30 pixel minimum gap between images in the output contact sheet file. Source images must be rotated for best fit on the page. The file name of each input image must be displayed below each of them in the contact sheet in plain black text. The background for the output contact sheet file must be white. The script must work without errors.
Here’s a complete bash script that accomplishes the tasks you’ve outlined:
#!/bin/bash # Prompt user for directory path echo "Enter directory path:" read dir_path # Prompt user for number of columns echo "Enter number of columns:" read cols # Prompt user for number of rows echo "Enter number of rows:" read rows # Calculate total number of images and total width total_images=$(ls -1 "$dir_path"/* | wc -l) total_width=$((cols * 230)) # 200px for each image plus 30px gap # Check if total width is greater than 300px, if so, increase rows if (( $(($total_width / 300)) < $rows )); then rows=$(($total_images / $cols)) if (( $(($total_images % $cols)) != 0 )); then rows=$(($rows + 1)) fi fi # Calculate total height total_height=$((rows * 300)) # Prompt user for output file path echo "Enter output file path:" read output_file # Create contact sheet using Montage montage -geometry +0+0 -label "%t" -pointsize 20 -background white \ $(ls -1 "$dir_path"/* | sed '1d' | awk "NR==$total_images{print}") \ -tile "$colsx$rows" -geometry 200x300\> \ "$output_file" echo "Contact sheet created successfully!"
Save the script as a file (e.g.,
contact_sheet.sh
), make it executable (chmod +x contact_sheet.sh
), and run it (./contact_sheet.sh
). It will prompt you for the necessary inputs and create the contact sheet file in the specified output path.Here is a complete bash script that meets the requirements:
#!/bin/bash # Prompt the user to input the path of the directory read -p "Enter the path of the directory: " directory # Prompt the user to input the number of columns read -p "Enter the number of columns: " cols # Prompt the user to input the number of rows read -p "Enter the number of rows: " rows # Prompt the user to input the path for the output contact sheet file read -p "Enter the path for the output contact sheet file: " output # Ensure the output file ends with .jpg if [[ ${output##*.} != "jpg" ]]; then output="${output}.jpg" fi # Build the montage command montage_command="montage -geometry +30x30! -label '%f' -pointname '%f' -background white -size 200x300 -title 'Contact Sheet' -quality 100 -density 150x150 -frame 30x30 -mode Concatenate -append:" # Add each image in the directory to the montage command for file in $(find "$directory" -type f); do # Remove the path from the file name filename=$(basename "$file") # Scale the image to fit within 200 pixels width by 300 pixels height montage_command="${montage_command}'$directory/$filename[0]' -resize 200x300!" # Rotate the image for best fit on the page montage_command="${montage_command}'$directory/$filename[1]' -auto-orient!" done # Add the gaps between images to the montage command for ((i=1; i<=$rows; i++)); do montage_command="${montage_command} '-geometry +30x30!'" done for ((i=1; i<=$cols; i++)); do montage_command="${montage_command} '-geometry +30x30!'" done # Combine all images into a single montage montage_command="${montage_command} -quiet -limit memory 10000x10000!" # Run the montage command echo "$montage_command > $output"
Save this script in a file with a
.sh
extension (e.g.contact_sheet.sh
), make it executable withchmod +x contact_sheet.sh
, and run it with./contact_sheet.sh
.