fix zip_image.sh
This commit is contained in:
parent
41b5e731ea
commit
59a3b47f36
@ -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 "$@"' _ {}
|
Loading…
Reference in New Issue
Block a user