Нещодавно почав вчити shell, бо виникла потреба розрізати зображення в TIFF форматі розміром 2.1Гб з роздільною здатністю 86400 х 43200 на фрагменти 200 х 200 і ще 400 на 400.. але комп'ютер не дуже потужний, щоб різати його в графічному редакторі та і довго це буде.. тому вирішив скористатися ImageMagick.. але знову кількість команд величезна буде.. тому вирішив автоматизувати shell-ом цей процес.. та так, як його не знаю - почав вчити.. але успіхи мої не дуже.. за потреби з архівацією 300 папок в 300 архівів впорався більш менш швидко.. і з т.п. проблемами.. але коли дійшов до цієї - виявилося вчитися і вчитися треба набагато більше ніж вважав спочатку.. якщо хто може - допоможіть впоратися з shell-ом..
Ось код:
# Img2Matrix
# ====================================================================================
# Змінні!
# ====================================================================================
# Експорт змінних
export size_img_x; # Ширина зображення, що треба розрізати
export size_img_y; # Висота зображення, що треба розрізати
export name_input_img; # Ім'я файла для розрізання
export name_output_img; # Шаблон назви файла після розрізання
export size_block; # Розмір блоку нового файла
export blocks; # Кількість блоків
export blocks_in_x; # Кількість блоків в ширину
export blocks_in_y; # Кількість блоків в висоту
# ====================================================================================
# Функції!
# ====================================================================================
# Функція лінії розділу
print_line ()
{
echo "================================================================================";
return;
}
print_data ()
{
echo "Зображення $name_input_img буде розрізано на $blocks розміром $size_block x $size_block ";
return;
}
print_name ()
{
echo "==================== Img2Matrix v.1.0 ========================================";
return;
}
print_end ()
{
print_line;
echo "Програму успішно завершено!";
print_line;
return;
}
msg ()
{
a=`expr $1 + 1`;
b=`expr $2 + 1`;
p=`expr $1 "*" $2`;
print_line;
echo "Створено $p з $blocks";
print_line;
return;
}
# Обробка помилок
# Функція перевірки розміру зображення на відповідність
size_img_error ()
{
size_err_img="";
if [ 0 -ne `expr $size_img_x % $size_block` ]
then size_err_img="Ширина вхідного зображення не кратна ширині вихідних зображень";
fi
if [ 0 -ne `expr $size_img_y % $size_block` ]
then size_err_img="Ширина вхідного зображення не кратна висоті вихідних зображень";
fi
if [ 1 -lt `expr $size_img_x % $size_block` ]
then size_err_img="Ширина вхідного зображення менша за ширину вихідних зображень";
fi
if [ 1 -lt `expr $size_img_y % $size_block` ]
then size_err_img="Ширина вхідного зображення менша за висоту вихідних зображень";
fi
if [ -r $name_input_img ]
then size_err_img="Немає доступу до початкового файлу";
fi
return $size_err_img;
}
# Функції обробки введення параметрів для Img2Matrix
enter_name_input_file ()
{
print_line;
echo -n "Введіть ім'я файлу, що потрібно розрізати:";
read name_input_file;
print_line;
return $name_input_file;
}
enter_name_output_file ()
{
print_line;
echo -n "Введіть ім'я файлу, що потрібно розрізати:";
read name_output_file;
print_line;
return $name_output_file;
}
enter_size_block ()
{
print_line;
echo -n "Введіть розмір матриці:";
read fn_size_block;
print_line;
return $fn_size_block;
}
enter_size_x ()
{
c_fn_x=0;
while [ 1 -lt `expr $size_img_x % $size_block` ]
do
print_line;
if [ $c_fn_x -le 0 ]
then echo "Ширина вхідного зображення менша за ширину вихідних зображень";
fi
echo -n "Введіть ширину зображення, яке потрібно розрізати:";
read size_x;
print_line;
c_fn_x=`expr $c_fn_x`;
done
return $size_x;
}
enter_size_y ()
{
c_fn_y=0;
while [ 1 -lt `expr $size_img_y % $size_block` ]
do
print_line;
if [ $c_fn_y -le 0 ]
then echo "Висота вхідного зображення менша за висоту вихідних зображень";
fi
echo -n "Введіть висоту зображення, яке потрібно розрізати:";
read size_y;
print_line;
c_fn_y=`expr $c_fn_y`;
done
return $size_y;
}
# Функції обрахунку розмірів матриці
size_matrix_x ()
{
if [ 0 -eq `expr $size_img_x % $size_block` ]
then n_x=`expr $size_img_x / $size_block`;
else n_x=0;
fi
return n_x;
}
size_matrix_y ()
{
if [ 0 -eq `expr $size_img_y % $size_block` ]
then n_y=`expr $size_img_y / $size_block`;
else n_y=0;
fi
return n_y;
}
matrix ()
{
x1=`blocks_in_x`;
y1=`blocks_in_y`;
n_blocks=`expr $x1 '*' $y1`;
return $n_blocks;
}
# Підготовка параметрів для ImageMagick і його використання з визначеними параметрами
im ()
{
im_poz_x=$1;
im_poz_y=$2;
$poz_block_x=$3;
$poz_block_y=$4;
im_output_img=$name_output_img"_"$im_size_block"_"$poz_block_x"_"$poz_block_y".png";
im_size_block=$size_block"x"$size_block;
im_size_img=$size_img_x"x"$size_img_y;
im_set="'"$name_input_img"["$im_size_block"+"$im_poz_x"+"$im_poz_y"]'";
convert -crop $im_size_img -depth 8 $im_set $name_input_img $im_output_img;
return;
}
# Лічильники
poz_x ()
{
poz2_x=`expr $1 "*" $size_block`;
return $poz2_x;
}
poz_y ()
{
poz2_y=`expr $1 "*" $size_block`;
return $poz2_y;
}
num ()
{
x2=0;
y2=0;
xm=`size_matrix_x`;
ym=`size_matrix_y`;
while [ "y2" -ge $ym ]
do
x2=`expr $x2 + 1`;
if [ "x2" -ge $xm ]
then x2=0; y2=`expr y2 + 1`;
fi
x3=`poz_x $x2`;
y3=`poz_y $y2`;
im $x3 $y3 $x2 $y2;
msg $x2 $y2 $blocks;
done
return;
}
# Основна частина програми
program ()
{
num;
print_end;
return;
}
# ====================================================================================
# Тіло програми
# ====================================================================================
# Введення параметрів Img2Matrix
print_data;
if [ -n "$1" ]
then name_input_img=`enter_name_input_file`;
else name_input_img=$1;
fi
if [ -n "$2" ]
then name_output_img=`enter_size_block`;
else name_output_img=$2;
fi
if [ -n "$3" ]
then size_block=`enter_name_output_file`;
else size_block=$3;
fi
if [ -n "$4" ]
then name_output_img=`enter_size_x`;
else name_output_img=$4;
fi
if [ -n "$5" ]
then name_output_img=`enter_size_y`;
else name_output_img=$5;
fi
# Обрахування параметрів для Img2Matrix
blocks_in_x=`size_matrix_x`;
blocks_in_y=`size_matrix_y`;
blocks=`matrix`;
print_data;
errors=`size_err_img`;
if [ -n "$errors" ]
then program;
else $errors;
fi