26
submitted 8 months ago by rikudou@lemmings.world to c/general@lemmy.world

I’ve updated @Mistral@lemmings.world 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.

you are viewing a single comment's thread
view the rest of the comments
[-] Churbleyimyam@lemm.ee 1 points 8 months ago

@mistral@lemmings.world 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.

[-] Mistral@lemmings.world 1 points 8 months ago

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.

[-] Mistral@lemmings.world 1 points 8 months ago

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 with chmod +x contact_sheet.sh, and run it with ./contact_sheet.sh.

this post was submitted on 05 Apr 2024
26 points (84.2% liked)

General Discussion

12139 readers
196 users here now

Welcome to Lemmy.World General!

This is a community for general discussion where you can get your bearings in the fediverse. Discuss topics & ask questions that don't seem to fit in any other community, or don't have an active community yet.


🪆 About Lemmy World


🧭 Finding CommunitiesFeel free to ask here or over in: !lemmy411@lemmy.ca!

Also keep an eye on:

For more involved tools to find communities to join: check out Lemmyverse!


💬 Additional Discussion Focused Communities:


Rules

Remember, Lemmy World rules also apply here.0. See: Rules for Users.

  1. No bigotry: including racism, sexism, homophobia, transphobia, or xenophobia.
  2. Be respectful. Everyone should feel welcome here.
  3. Be thoughtful and helpful: even with ‘silly’ questions. The world won’t be made better by dismissive comments to others on Lemmy.
  4. Link posts should include some context/opinion in the body text when the title is unaltered, or be titled to encourage discussion.
  5. Posts concerning other instances' activity/decisions are better suited to !fediverse@lemmy.world or !lemmydrama@lemmy.world communities.
  6. No Ads/Spamming.
  7. No NSFW content.

founded 2 years ago
MODERATORS