fix zip_image.sh
This commit is contained in:
parent
41b5e731ea
commit
59a3b47f36
@ -9,8 +9,8 @@ THREADS=$(getconf _NPROCESSORS_ONLN)
|
||||
echo "Используется $THREADS потоков для обработки."
|
||||
|
||||
# Файлы логирования
|
||||
LOG_FILE="./compression.log"
|
||||
ERROR_LOG_FILE="./error.log"
|
||||
LOG_FILE="./zip_image_compression.log"
|
||||
ERROR_LOG_FILE="./zip_image_error.log"
|
||||
|
||||
# Инициализируем файлы логов (удалены строки, чтобы не затирать логи)
|
||||
# : > "$LOG_FILE"
|
||||
@ -67,6 +67,13 @@ process_png() {
|
||||
|
||||
mkdir -p "$output_dir"
|
||||
|
||||
# Проверка файла ошибки
|
||||
local error_file="${output_file}.error"
|
||||
if [ -f "$error_file" ]; then
|
||||
# Файл ошибки существует, пропускаем обработку
|
||||
return
|
||||
fi
|
||||
|
||||
# Проверка хеша файла
|
||||
local hash_file="${output_file}.md5"
|
||||
local current_hash
|
||||
@ -81,40 +88,64 @@ process_png() {
|
||||
fi
|
||||
fi
|
||||
|
||||
cp "$input_file" "$output_file"
|
||||
# Используем временный файл для обработки
|
||||
local temp_output_file="${output_file}.tmp"
|
||||
cp "$input_file" "$temp_output_file"
|
||||
|
||||
# Размер до сжатия
|
||||
local original_size
|
||||
original_size=$(get_file_size "$output_file")
|
||||
original_size=$(get_file_size "$input_file")
|
||||
|
||||
# Используем pngquant
|
||||
if ! pngquant --quality=90-100 --speed 1 --output "$output_file" --force "$input_file"; then
|
||||
log_error "Ошибка при сжатии $input_file с помощью pngquant"
|
||||
if ! pngquant --quality=90-100 --speed 1 --output "$temp_output_file" --force "$input_file"; then
|
||||
local error_msg="Ошибка при сжатии $input_file с помощью pngquant"
|
||||
log_error "$error_msg"
|
||||
echo "$error_msg" > "$error_file"
|
||||
rm -f "$temp_output_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Дополнительная оптимизация с помощью zopflipng
|
||||
if ! zopflipng -y "$output_file" "$output_file"; then
|
||||
log_error "Ошибка при оптимизации $output_file с помощью zopflipng"
|
||||
if ! zopflipng -y "$temp_output_file" "$temp_output_file"; then
|
||||
local error_msg="Ошибка при оптимизации $temp_output_file с помощью zopflipng"
|
||||
log_error "$error_msg"
|
||||
echo "$error_msg" > "$error_file"
|
||||
rm -f "$temp_output_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Размер после сжатия
|
||||
local new_size
|
||||
new_size=$(get_file_size "$output_file")
|
||||
new_size=$(get_file_size "$temp_output_file")
|
||||
|
||||
# Проверка, что original_size не равен нулю
|
||||
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
|
||||
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
|
||||
reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}")
|
||||
|
||||
log_success "Сжат PNG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)"
|
||||
|
||||
# Перемещаем временный файл на место выходного
|
||||
mv "$temp_output_file" "$output_file"
|
||||
|
||||
# Сохраняем хеш
|
||||
echo "$current_hash" > "$hash_file"
|
||||
}
|
||||
export -f process_png
|
||||
@ -129,6 +160,13 @@ process_jpeg() {
|
||||
|
||||
mkdir -p "$output_dir"
|
||||
|
||||
# Проверка файла ошибки
|
||||
local error_file="${output_file}.error"
|
||||
if [ -f "$error_file" ]; then
|
||||
# Файл ошибки существует, пропускаем обработку
|
||||
return
|
||||
fi
|
||||
|
||||
# Проверка хеша файла
|
||||
local hash_file="${output_file}.md5"
|
||||
local current_hash
|
||||
@ -143,34 +181,55 @@ process_jpeg() {
|
||||
fi
|
||||
fi
|
||||
|
||||
cp "$input_file" "$output_file"
|
||||
# Используем временный файл для обработки
|
||||
local temp_output_file="${output_file}.tmp"
|
||||
cp "$input_file" "$temp_output_file"
|
||||
|
||||
# Размер до сжатия
|
||||
local original_size
|
||||
original_size=$(get_file_size "$output_file")
|
||||
original_size=$(get_file_size "$input_file")
|
||||
|
||||
# Используем mozjpeg
|
||||
if ! mozjpeg -quality 95 -progressive -optimize -outfile "$output_file" "$input_file"; then
|
||||
log_error "Ошибка при сжатии $input_file с помощью mozjpeg"
|
||||
if ! cjpeg -quality 95 -progressive -optimize -outfile "$temp_output_file" "$input_file"; then
|
||||
local error_msg="Ошибка при сжатии $input_file с помощью mozjpeg"
|
||||
log_error "$error_msg"
|
||||
echo "$error_msg" > "$error_file"
|
||||
rm -f "$temp_output_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Размер после сжатия
|
||||
local new_size
|
||||
new_size=$(get_file_size "$output_file")
|
||||
new_size=$(get_file_size "$temp_output_file")
|
||||
|
||||
# Проверка, что original_size не равен нулю
|
||||
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
|
||||
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
|
||||
reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}")
|
||||
|
||||
log_success "Сжат JPEG файл: $input_file на $reduction% ($original_size байт -> $new_size байт)"
|
||||
|
||||
# Перемещаем временный файл на место выходного
|
||||
mv "$temp_output_file" "$output_file"
|
||||
|
||||
# Сохраняем хеш
|
||||
echo "$current_hash" > "$hash_file"
|
||||
}
|
||||
export -f process_jpeg
|
||||
@ -186,6 +245,13 @@ process_webp() {
|
||||
|
||||
mkdir -p "$output_dir"
|
||||
|
||||
# Проверка файла ошибки
|
||||
local error_file="${output_file}.error"
|
||||
if [ -f "$error_file" ]; then
|
||||
# Файл ошибки существует, пропускаем обработку
|
||||
return
|
||||
fi
|
||||
|
||||
# Проверка хеша файла
|
||||
local hash_file="${output_file}.md5"
|
||||
local current_hash
|
||||
@ -204,27 +270,49 @@ process_webp() {
|
||||
local original_size
|
||||
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
|
||||
fi
|
||||
|
||||
# Размер после конвертации
|
||||
local new_size
|
||||
new_size=$(get_file_size "$output_file")
|
||||
new_size=$(get_file_size "$temp_output_file")
|
||||
|
||||
# Проверка, что original_size не равен нулю
|
||||
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
|
||||
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
|
||||
reduction=$(awk "BEGIN {printf \"%.2f\", (($original_size - $new_size) / $original_size) * 100}")
|
||||
|
||||
log_success "Конвертирован в WebP: $input_file на $reduction% ($original_size байт -> $new_size байт)"
|
||||
|
||||
# Перемещаем временный файл на место выходного
|
||||
mv "$temp_output_file" "$output_file"
|
||||
|
||||
# Сохраняем хеш
|
||||
echo "$current_hash" > "$hash_file"
|
||||
}
|
||||
export -f process_webp
|
||||
@ -244,6 +332,6 @@ find "$IMAGE_DIR" -type f \
|
||||
xargs -0 -P "$THREADS" -I {} bash -c 'process_jpeg "$@"' _ {}
|
||||
|
||||
# Конвертация в 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 | \
|
||||
xargs -0 -P "$THREADS" -I {} bash -c 'process_webp "$@"' _ {}
|
Loading…
Reference in New Issue
Block a user