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.

  • @Churbleyimyam@lemm.ee
    link
    fedilink
    18 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.

    • @MistralB
      link
      18 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.

    • @MistralB
      link
      18 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.