Автор Гілка: Створення на Shell  (Прочитано 3480 раз)

Відсутній HetmanNet

  • Графоман
  • ****
  • дописів: 412
  • Карма: +1/-0
  • Fedora, CentOS, RHEL, KDE
Створення на Shell
« : 2011-07-06 23:57:45 »
Нещодавно почав вчити 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
Віддамся на один вечір в хороші дівочі руки.. не дорого, в у.о. .. Якщо сподобається, то залишуся безкоштовно назавжди..

idontremember

  • Гість
Re: Створення на Shell
« Відповідей #1 : 2011-07-09 18:14:21 »
 [smiley=wacko2.gif] [smiley=ogo.gif] хм-м... пан r00t_x такого не вживає.

Відсутній HetmanNet

  • Графоман
  • ****
  • дописів: 412
  • Карма: +1/-0
  • Fedora, CentOS, RHEL, KDE
Re: Створення на Shell
« Відповідей #2 : 2011-07-09 18:18:46 »
[smiley=wacko2.gif] [smiley=ogo.gif] хм-м... пан r00t_x такого не вживає.
чому це?
Віддамся на один вечір в хороші дівочі руки.. не дорого, в у.о. .. Якщо сподобається, то залишуся безкоштовно назавжди..

idontremember

  • Гість
Re: Створення на Shell
« Відповідей #3 : 2011-07-09 22:08:48 »
чому це?
Ну могли б код написати в цьому тегові, та і взагалі де ви взяли отой графічний файл? Я колись малював фотошопом файл розміром більше 300 мегабайт. Ой тормозілко було ще й яке.
---
А як можна порізати графічний файл на шматки, щоб його  не пошкодити? У наведаний скрипт я не вникав.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Створення на Shell
« Відповідей #4 : 2011-07-10 11:38:31 »
Мої очі не витримали цього знущання, а я пробував декілька раз. Можете перепостити код відмітивши його через [ CODE ] [ / CODE ] замість жовтого кольору? Або заархівуйте і закиньте як долучення до повідомлення.
[Fedora Linux]

Відсутній HetmanNet

  • Графоман
  • ****
  • дописів: 412
  • Карма: +1/-0
  • Fedora, CentOS, RHEL, KDE
Re: Створення на Shell
« Відповідей #5 : 2011-07-10 13:22:17 »
Добре.. код в середині архіву.. :)
Можу коротко сказати що повинно робити:
1. Розрізало зображення на рівні квадрати
2. Кожен квадрат автоматично іменувало по шаблону: назва-розмір_однієї сторони_квадрата_координата квадрата_по_Xхкоордината_квадрата_по_Y.png
3. Розташовувало квадрати в теці з ім'ям: назва_файлу_розмір_однієї сторони квадрата

P.S. Щодо розміру файлу - якщо є бажання все можна знайти..  ;)
« Змінено: 2011-07-10 13:22:45 від HetmanNet »
Віддамся на один вечір в хороші дівочі руки.. не дорого, в у.о. .. Якщо сподобається, то залишуся безкоштовно назавжди..

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Створення на Shell
« Відповідей #6 : 2011-07-13 14:24:22 »
Стійкий рвотний рефлекс не дає мені змоги розібратися в коді, але мені здається, що ви маєте бажання написати аналог команди:
convert input.png -crop 200x200 out.png
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Створення на Shell
« Відповідей #7 : 2011-07-13 16:28:23 »
#!/bin/bash
# Author: Volodymyr M. Lisivka <vlisivka@gmail.com>
set -ue
. import.sh arguments

INPUT_FILE=""
OUTPUT_FILE_NAME=""
WIDTH="100"

main() {

  local DIR_NAME="$OUTPUT_FILE_NAME-$WIDTH"

  # (re)create output directory
  rm -rf "$DIR_NAME"
  mkdir -p "$DIR_NAME"

  # Crop image to tiles and write information about each tile to text file in format, which is suitable for shell
  convert "$INPUT_FILE" -crop "${WIDTH}x$WIDTH" -format 'mv -f "tile-$((%p-1)).png"  "'"$OUTPUT_FILE_NAME"'-%wx%h%O.png"'  -write "info:$DIR_NAME/script.sh"  "$DIR_NAME/tile-%d.png"

  # Execute script to rename tiles
  (
    cd "$DIR_NAME"
    bash -ue "./script.sh"
    rm -f "./script.sh"
  )
}

parse_arguments "-i|--input-file)INPUT_FILE;S"  "-o|--output-file-name)OUTPUT_FILE_NAME;S" "-w|--width)WIDTH;S" -- "${@:+$@}"

main "${ARGUMENTS[@]:+${ARGUMENTS[@]}}"

PS.
Я використав bash-modules для вводу параметрів.
« Змінено: 2011-07-13 16:30:05 від lvm »
[Fedora Linux]