Shell script to change pics

Published

Sun, 30 of March, 2025

Modified

Fri, 28 of March, 2025

change format for individual .HEIC pic

# Specify input directory, file name, and output directory
input_dir="/Users/luisamimmi/Documents/14_FOTO/2025_50esimo"
output_dir="/Users/luisamimmi/Documents/14_FOTO/2025_50esimo_jpg"
# single foto
file_name="IMG_5398.heic"

# Construct full input and output file paths
input_file="${input_dir}/${file_name}"
output_file="${output_dir}/${file_name%.heic}.jpg"

# Convert to .jpg
sips -s format jpeg "$input_file" --out "$output_file"

Needed to change size and format

#!/bin/zsh

# Funzione per convertire le immagini .HEIC in .jpg
convert_heic_to_jpg() {
    # Check if input directory exists
    if [ ! -d "$input_dir" ]; then
        echo "Input directory $input_dir does not exist."
        return 1
    fi

    # Check if output directory exists, if not, create it
    if [ ! -d "$output_dir" ]; then
        mkdir -p "$output_dir"
        if [ $? -ne 0 ]; then
            echo "Failed to create output directory $output_dir."
            return 1
        fi
    fi

    # Check if there are any .HEIC files in the input directory
    shopt -s nullglob
    heic_files=("$input_dir"/*.HEIC)
    shopt -u nullglob

    if [ ${#heic_files[@]} -eq 0 ]; then
        echo "No .HEIC files found in $input_dir."
        return 1
    fi

    # Convert each .HEIC file to .jpg
    for file in "${heic_files[@]}"; do
        base_name=$(basename "$file" .HEIC)
        convert "$file" -quality 85 "$output_dir/$base_name.jpg"
        if [ $? -eq 0 ]; then
            echo "Converted $file to $output_dir/$base_name.jpg"
        else
            echo "Failed to convert $file."
        fi
    done
}


# Funzione per ridurre la dimensione dei file a meno di 2 megabyte
reduce_image_size() {
    # Check if output directory exists
    if [ ! -d "$output_dir" ]; then
        echo "Output directory $output_dir does not exist."
        return 1
    fi

    # Check if there are any .jpg files in the output directory
    shopt -s nullglob
    jpg_files=("$output_dir"/*.jpg)
    shopt -u nullglob

    if [ ${#jpg_files[@]} -eq 0 ]; then
        echo "No .jpg files found in $output_dir."
        return 1
    fi

    # Reduce each .jpg file to less than 2 megabytes
    for file in "${jpg_files[@]}"; do
        while [ $(stat -f%z "$file") -ge 1000000 ]; do
            mogrify -resize 90% "$file"
        done
        echo "Reduced size of $file"
    done
}
# ----4 esempio 
# Directory contenente le immagini .HEIC
input_dir="/Users/luisamimmi/Github/cv_typst/assets/img"

# Directory dove salvare le immagini convertite
output_dir="/Users/luisamimmi/Github/cv_typst/assets/img/smaller"

# Call the 1 function
convert_heic_to_jpg
# Call the 2 function
reduce_image_size
#!/bin/zsh

# move to desired dir 
cd $input_dir

# Funzione per ridurre la dimensione delle immagini sotto 1MB in meno passaggi
reduce_any_image_size() {
    mkdir -p "./output"
    max_size=5000000

    find . -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.png" \) | while read -r file; do
        base_name=$(basename "$file")
        cp "$file" "./output/$base_name"
        quality=85

        while [[ $(stat -f%z "./output/$base_name") -ge $max_size ]]; do
            if [[ $quality -gt 10 ]]; then
                magick "./output/$base_name" -quality $quality "./output/$base_name"
                quality=$((quality - 5))
            else
                magick "./output/$base_name" -resize 90% "./output/$base_name"
            fi
        done

        echo "Reduced $base_name to $(stat -f%z "./output/$base_name") bytes"
    done
}


# Esecuzione della funzione
reduce_any_image_size