fix zip_image.sh

This commit is contained in:
Struchkov Mark 2024-09-25 10:07:46 +03:00
parent 41b5e731ea
commit 59a3b47f36
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C

View File

@ -9,8 +9,8 @@ THREADS=$(getconf _NPROCESSORS_ONLN)
echo "Используется $THREADS потоков для обработки." echo "Используется $THREADS потоков для обработки."
# Файлы логирования # Файлы логирования
LOG_FILE="./compression.log" LOG_FILE="./zip_image_compression.log"
ERROR_LOG_FILE="./error.log" ERROR_LOG_FILE="./zip_image_error.log"
# Инициализируем файлы логов (удалены строки, чтобы не затирать логи) # Инициализируем файлы логов (удалены строки, чтобы не затирать логи)
# : > "$LOG_FILE" # : > "$LOG_FILE"
@ -67,6 +67,13 @@ process_png() {
mkdir -p "$output_dir" mkdir -p "$output_dir"
# Проверка файла ошибки
local error_file="${output_file}.error"
if [ -f "$error_file" ]; then
# Файл ошибки существует, пропускаем обработку
return
fi
# Проверка хеша файла # Проверка хеша файла
local hash_file="${output_file}.md5" local hash_file="${output_file}.md5"
local current_hash local current_hash
@ -81,40 +88,64 @@ process_png() {
fi fi
fi fi
cp "$input_file" "$output_file" # Используем временный файл для обработки
local temp_output_file="${output_file}.tmp"
cp "$input_file" "$temp_output_file"
# Размер до сжатия # Размер до сжатия
local original_size local original_size
original_size=$(get_file_size "$output_file") original_size=$(get_file_size "$input_file")
# Используем pngquant # Используем pngquant
if ! pngquant --quality=90-100 --speed 1 --output "$output_file" --force "$input_file"; then if ! pngquant --quality=90-100 --speed 1 --output "$temp_output_file" --force "$input_file"; then
log_error "Ошибка при сжатии $input_file с помощью pngquant" local error_msg="Ошибка при сжатии $input_file с помощью pngquant"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Дополнительная оптимизация с помощью zopflipng # Дополнительная оптимизация с помощью zopflipng
if ! zopflipng -y "$output_file" "$output_file"; then if ! zopflipng -y "$temp_output_file" "$temp_output_file"; then
log_error "Ошибка при оптимизации $output_file с помощью zopflipng" local error_msg="Ошибка при оптимизации $temp_output_file с помощью zopflipng"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Размер после сжатия # Размер после сжатия
local new_size local new_size
new_size=$(get_file_size "$output_file") new_size=$(get_file_size "$temp_output_file")
# Проверка, что original_size не равен нулю # Проверка, что original_size не равен нулю
if [ "$original_size" -eq 0 ]; then if [ "$original_size" -eq 0 ]; then
log_error "Ошибка: размер оригинального файла равен 0 для $output_file" local error_msg="Ошибка: размер оригинального файла равен 0 для $input_file"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Проверка, уменьшился ли размер файла
if [ "$new_size" -ge "$original_size" ]; then
log_success "Сжатие не уменьшило размер файла $input_file, пропускаем сохранение"
# Сохраняем хеш, чтобы не обрабатывать файл снова
echo "$current_hash" > "$hash_file"
rm -f "$temp_output_file"
return
fi
# Процент сжатия # Процент сжатия
local reduction local reduction
reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}") reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}")
log_success "Сжат PNG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)" log_success "Сжат PNG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)"
# Перемещаем временный файл на место выходного
mv "$temp_output_file" "$output_file"
# Сохраняем хеш
echo "$current_hash" > "$hash_file" echo "$current_hash" > "$hash_file"
} }
export -f process_png export -f process_png
@ -129,6 +160,13 @@ process_jpeg() {
mkdir -p "$output_dir" mkdir -p "$output_dir"
# Проверка файла ошибки
local error_file="${output_file}.error"
if [ -f "$error_file" ]; then
# Файл ошибки существует, пропускаем обработку
return
fi
# Проверка хеша файла # Проверка хеша файла
local hash_file="${output_file}.md5" local hash_file="${output_file}.md5"
local current_hash local current_hash
@ -143,34 +181,55 @@ process_jpeg() {
fi fi
fi fi
cp "$input_file" "$output_file" # Используем временный файл для обработки
local temp_output_file="${output_file}.tmp"
cp "$input_file" "$temp_output_file"
# Размер до сжатия # Размер до сжатия
local original_size local original_size
original_size=$(get_file_size "$output_file") original_size=$(get_file_size "$input_file")
# Используем mozjpeg # Используем mozjpeg
if ! mozjpeg -quality 95 -progressive -optimize -outfile "$output_file" "$input_file"; then if ! cjpeg -quality 95 -progressive -optimize -outfile "$temp_output_file" "$input_file"; then
log_error "Ошибка при сжатии $input_file с помощью mozjpeg" local error_msg="Ошибка при сжатии $input_file с помощью mozjpeg"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Размер после сжатия # Размер после сжатия
local new_size local new_size
new_size=$(get_file_size "$output_file") new_size=$(get_file_size "$temp_output_file")
# Проверка, что original_size не равен нулю # Проверка, что original_size не равен нулю
if [ "$original_size" -eq 0 ]; then if [ "$original_size" -eq 0 ]; then
log_error "Ошибка: размер оригинального файла равен 0 для $output_file" local error_msg="Ошибка: размер оригинального файла равен 0 для $input_file"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Проверка, уменьшился ли размер файла
if [ "$new_size" -ge "$original_size" ]; then
log_success "Сжатие не уменьшило размер файла $input_file, пропускаем сохранение"
# Сохраняем хеш, чтобы не обрабатывать файл снова
echo "$current_hash" > "$hash_file"
rm -f "$temp_output_file"
return
fi
# Процент сжатия # Процент сжатия
local reduction local reduction
reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}") reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}")
log_success "Сжат JPEG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)" log_success "Сжат JPEG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)"
# Перемещаем временный файл на место выходного
mv "$temp_output_file" "$output_file"
# Сохраняем хеш
echo "$current_hash" > "$hash_file" echo "$current_hash" > "$hash_file"
} }
export -f process_jpeg export -f process_jpeg
@ -186,6 +245,13 @@ process_webp() {
mkdir -p "$output_dir" mkdir -p "$output_dir"
# Проверка файла ошибки
local error_file="${output_file}.error"
if [ -f "$error_file" ]; then
# Файл ошибки существует, пропускаем обработку
return
fi
# Проверка хеша файла # Проверка хеша файла
local hash_file="${output_file}.md5" local hash_file="${output_file}.md5"
local current_hash local current_hash
@ -204,27 +270,49 @@ process_webp() {
local original_size local original_size
original_size=$(get_file_size "$input_file") original_size=$(get_file_size "$input_file")
if ! cwebp -mt -af -quiet -m 6 -q 95 -pass 10 "$input_file" -o "$output_file"; then # Создаем временный файл для вывода
log_error "Ошибка при конвертации $input_file в WebP" local temp_output_file="${output_file}.tmp"
if ! cwebp -mt -af -quiet -m 6 -q 95 -pass 10 "$input_file" -o "$temp_output_file"; then
local error_msg="Ошибка при конвертации $input_file в WebP"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Размер после конвертации # Размер после конвертации
local new_size local new_size
new_size=$(get_file_size "$output_file") new_size=$(get_file_size "$temp_output_file")
# Проверка, что original_size не равен нулю # Проверка, что original_size не равен нулю
if [ "$original_size" -eq 0 ]; then if [ "$original_size" -eq 0 ]; then
log_error "Ошибка: размер оригинального файла равен 0 для $input_file" local error_msg="Ошибка: размер оригинального файла равен 0 для $input_file"
log_error "$error_msg"
echo "$error_msg" > "$error_file"
rm -f "$temp_output_file"
return 1 return 1
fi fi
# Проверка, уменьшился ли размер файла
if [ "$new_size" -ge "$original_size" ]; then
log_success "Конвертация в WebP не уменьшила размер файла $input_file, пропускаем сохранение"
# Сохраняем хеш, чтобы не обрабатывать файл снова
echo "$current_hash" > "$hash_file"
rm -f "$temp_output_file"
return
fi
# Процент сжатия # Процент сжатия
local reduction local reduction
reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}") reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}")
log_success "Конвертирован в WebP: $input_file на $reduction% ($original_size байт -> $new_size байт)" log_success "Конвертирован в WebP: $input_file на $reduction% ($original_size байт -> $new_size байт)"
# Перемещаем временный файл на место выходного
mv "$temp_output_file" "$output_file"
# Сохраняем хеш
echo "$current_hash" > "$hash_file" echo "$current_hash" > "$hash_file"
} }
export -f process_webp export -f process_webp
@ -244,6 +332,6 @@ find "$IMAGE_DIR" -type f \
xargs -0 -P "$THREADS" -I {} bash -c 'process_jpeg "$@"' _ {} xargs -0 -P "$THREADS" -I {} bash -c 'process_jpeg "$@"' _ {}
# Конвертация в WebP # Конвертация в WebP
find ./images/comp -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) \ find "$COMP_DIR" -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) \
-print0 | \ -print0 | \
xargs -0 -P "$THREADS" -I {} bash -c 'process_webp "$@"' _ {} xargs -0 -P "$THREADS" -I {} bash -c 'process_webp "$@"' _ {}