Демотиваторы


opium_inside - Posted on 25 Июнь 2009

Все мы знаем ныне популярный формат картинок в интернете - демотиваторы. Известен так же и бум , связанный с ними. Программы для создания демотиваторов были написаны на огромном множестве языков программирования. Но линуксоид во всем и всегда должен быть первым =) Внесу свою скромную лепту. Создаем демотивационные постеры одной командой при помощи скрипта!

#!/bin/sh
# Demotivation by William Meth
# ver. 0.4 Copyleft (C) 2009 BSD license
#
# Отправляйте Ваши замечания и предложения на veyko2002'at'gmail.com
#
# Thanks to:
#   ramok by http://linsovet.com
#       code cleaning
#
# TODO: Сделать так чтобы опции решали необязательные параметры, а синтаксис
#       сводился к виду demotivation [-HoFfSsC ] "входящее изображение" "текст
#       заголовка" "текст пояснения" 
 
# Коды ошибок
ERROPT="1"     # Неверная опция
ENOVALUE="2"   # Не прописано значение опции
ENOIMAGE="3"   # Не дан входной файл
ESCALE_ERR="4" # Не получилось изменить изображение
ENODEPS="5"    # Нерешенные зависимости
ESHIT="255"    # Маловероятная ошибка
 
#несколько технических переменных
MYNAME=`basename $0` #получаем имя скрипта
RC=$HOME/.${MYNAME}rc #Место нахождения конфига.
 
#Создаем файл ресурсов, если еще не существует.
#Пожалуйста, не изменяйте свои параметры тут! Для этого есть конфиг.
if [ ! -f "$RC" ]; then
    cat << END_OF_RC > $RC
DEST="dem\$(date +%N).png" # Имя файла
H_FONT="/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf" # Шрифт заголовка
T_FONT="/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf" # Шрифт пояснения
H_SIZE="64" # Размер заголовка
T_SIZE="32" # Размер пояснения
SCALE="640" # Размер 
END_OF_RC
fi
 
# считываем конфиг файл
. $RC
 
#Проверка наличия необходимых компонентов
which convert &> /dev/null
if [ $? -gt 0 ]; then
  echo 'Для корректной работы программы требуется пакет "ImageMagic"' 1>&2
  exit $ENODEPS
fi
 
 
motivator_help() {
cat << END_OF_HELP
$MYNAME - Генератор демотиваторов
Использование:
  $MYNAME -i КАРТИНКА [-o КАРТИНКА] [-h ТЕКСТ] [-t текст]
  [-f ШРИФТ] [-F ШРИФТ] [-s РАЗМЕР] [-S РАЗМЕР] [-C ЧИСЛО]
Опции:
  -H - Показать эту справку
  -i - Исходное изображение
  -h - Текст заголовка
  -t - Текст пояснения
  -o - Выходной файл
  -F - Шрифт заголовка
  -f - Шрифт пояснения
  -S - Размер заголовка
  -s - Размер пояснения
  -C - Размер изображения
Для изменения параметров по умолчанию, редактируйте файл $RC
END_OF_HELP
} 
 
 
motivator_getopts() { 
while getopts ":i: h: t: o: f: F: s: S: C: H" optname; do #получаем аргументы
    case "$optname" in
        "i") IMAGE="${OPTARG}" ;;
        "h") HEAD_TEXT="${OPTARG}" ;;
        "t") TERM_TEXT="${OPTARG}" ;;
        "o") DEST="${OPTARG}" ;;
        "f") T_FONT="${OPTARG}" ;;
        "F") H_FONT="${OPTARG}" ;;
        "s") T_SIZE="${OPTARG}" ;;
        "S") H_SIZE="${OPTARG}" ;;
        "C") SCALE="${OPTARG}" ;;
        "H") motivator_help; exit 0 ;;
        "?") echo "нет опции \"${OPTARG}\"! Используйте -H для справки" 1>&2; exit $ERROPT ;;
        ":") echo "Не указан аргумент для опции \"${OPTARG}\"" 1>&2; exit $ENOVALUE ;;
          *) echo "Неизвестная ошибка" 1>&2; exit $ESHIT ;;
    esac
done
 
 
#Проверяем наличие входного файла
if [ -z "${IMAGE}" ]; then
  echo -e 'дайте мне исходную картинку!\n' 1>&2
  motivator_help
  exit $ENOIMAGE 
fi
}
 
 
#------Основной код------
 
#получаем аргументы
motivator_getopts "${@}" 
 
#Изменяем размер
convert -scale "${SCALE}" "${IMAGE}" "${DEST}" &> /dev/null
if [ $? -gt 0 ]; then
  echo 'Ошибка изменения размера изображения' 1>&2
  exit $ESCALE_ERR
fi
 
#Делаем рамку
mogrify -bordercolor black -border 2 \
        -bordercolor white -border 2 \
        -bordercolor black -border 70x0 "${DEST}"
 
#Пишем заголовок
if [ -n "${HEAD_TEXT}" ]; then
montage -geometry +0+0 -background black -fill white \
        -font "${H_FONT}" \
        -pointsize "${H_SIZE}" -label "${HEAD_TEXT}" "${DEST}" "${DEST}"
fi
 
#Пишем пояснение
if [ -n "${TERM_TEXT}" ]; then
montage -geometry +0+0 -background black -fill white \
        -font "${T_FONT}" \
        -pointsize "${T_SIZE}" -label "${TERM_TEXT}" "${DEST}" "${DEST}"
fi
 
#Если был заголовок или пояснение, делаем поля
if [ -n "${HEAD_TEXT}" -o -n "${TERM_TEXT}" ]; then
  mogrify -bordercolor black -border 5x45 "${DEST}"
fi
 
exit 0 #все хорошо, закончили. Уходим отсюда!
5
Ваша оценка: Ничего Рейтинг: 5 (3 голоса)

Спасибо за скрипт, пригодился для конкурса -

Такая же проблема, нужен модуль для создания демотиваторов на сайте - verydemotivational.ru, может кто нибудь поможет?
пишите через обратную связь, отблагодарю.

баг - при слишком длинном тексте он не переносится, а уходит за границу. можно как-то исправить?

Очень прошу расскажите как к сайту прикрутить сеё чудо?

ESHIT=265 ... Действительно фиговая ошибка :) Особенно учитывая то, что ерроркоды имеют размер в один байт ;)

бгг) Правда что ли? Вот черт) bugfix
ESHIT=255

fixed

очень и очень хорошо. а что бы вообще было прекрасно то можно добавить такие фичи:

0. вместо ${0} использовать только имя скрипт.

NAME=$(basename $0)

если пользователь вызовет скрипт как ~/bin/скрипт, то basename уберет ~/bin/

1. конфиг файл. заносим нужные переменные в ~/.ИМЯСКТИПТАrc и считываем его потом при запуске

...
############# Значения по умолчанию ###############
#
#Умолчания
ADR="/usr/bin" #папка с нужными утилитами
DEST="dem`date +%N`.png" #Имя файла
....
#==================================================================
 
NAME=$(basename $0)
 
# считываем конфиг файл
RC=$HOME/${NAME}rc
[ -f $RC ] && . $RC

и можно еще добавить опцию "генерация конфиг файла"
что бы можно было сделать
./скрипт -z > ~/.скриптrc
и получить конфиг файл с установками по умолчанию.
или создавать конфиг молча, если его нет (многие проги так и делают)

2. имена переменных с ошибками лучше начинать с E, такая традиция. посмотри в man errno

EOPT="1" #неверная опция
ENOVALUE="2" #не прописано значение опции
ENOIMAGE="3" #Не дан входной файл
...

3. установленые программы лучше проверять по which. у кого то imagemagick может стоять в /usr/local/bin

4. [[ и ]] это башизмы и можно и без них.
тогда можно будет убрать bash и оставить sh.
и скрипт автоматически будет работать и на *BSD системах

5. -i параметр можно и убрать, а брать картинку из того что осталось после разбора параметров.
и демативатор подразумевает текст. так что к обязательным параметрам относятся картинка и текст.
./скрипт картинка.jpg "много много текста в заголовок" "много текста в пояснение"

6. в копирайты добавить email автора. что бы слали патчи и пожелания

и повторюсь, скрипт хорош, а это просто для того что бы сделать совсем хорошо Ж:-)

Знал куда выкладываю, дело советуешь! Еще, угадай чей ник вместе с моим мылом добавится в копилефты?:) Сейчас после работы, сил нет. Просплюсь и поколдую над исправлением скрипта, все будет согласно рекомендациям. Реализацию *rc не хочешь на себя взять, чтобы было согласно стандартам? я в никсах ну очень недавно, месяц вот исполнился. Опять по части стандартов накосячу, стыдно будет! (чертовы буквы E) А вот по части "башизмов", я не большой фанат *BSD, но написанное однажды должно работать везде, с этим согласен. Попробуем сделать портативным (еще бы убедиться, что имиджмэджик под *BSD есть, я погуглю. А то будет забавно).

> Реализацию *rc не хочешь на себя взять, чтобы было согласно стандартам?
стандартов как таковых нет. просто в шел скрипте самое простое (и часто этим пользуются) сделать текстовый файл с объевлением шеловских переменных и запускать его потом в текущем шеле. что команда . (точка) и делает.
название локального конфига нафинается на точку, и заканчивается на rc. вот и все

> я в никсах ну очень недавно, месяц вот исполнился. Опять по части стандартов накосячу, стыдно будет!
если действительно месяц то впечатляет. а не ошиается только тот кто ничего не делает Ж:-)

насчет башизмов, в debian (и убунту как я подозреваю) есть пакет devscripts, в ктором есть скрипт checkbashisms.
он основные башизмы в скрипте проверяет и выдает предупреждения

> еще бы убедиться, что имиджмэджик под *BSD есть,
они там есть Ж:-) и достаточно проверки с which как я сказал.

Ждем ебилдов :)

По семейным причинам не мог заняться обещанным, приношу свои извенения ;( Для тех, кто до сих пор ждет ебилдов - вот вам версия 0.4.
Ченджлог - вынесен файл конфига, исправлены мелкие недочеты, убран мат и раздолбайство, теперь он работает под *BSD.
TODO - Сделайте так чтобы опции решали необязательные параметры, а синтаксис сводился к виду
demotivation [-HoFfSsC ] "входящее изображение" "текст заголовка" "текст пояснения"
Проверьте, пожалуйста, как он работает во фряхе (хотя бы). У меня нету возможности.

#!/bin/sh
#Demotivation by William Meth & Ramok. 
#Отправляйте Ваши замечания и предложения по адресу
#veyko2002'at'gmail.com
#V 0.4 Copyleft (C) BSD license
 
MYNAME=$(basename $0)
RC=$HOME/.${MYNAME}rc
if [ ! -e "$RC" ]
then
		echo '#############Изменяйте эти переменные под свои нужды###############
		#Умолчания
		DEST="dem`date +%N`.png" #Имя файла
		H_FONT="/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf" #Шрифт заголовка
		T_FONT="/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf" #Шрифт пояснения
		H_SIZE="64" #Размер заголовка
		T_SIZE="32" #размер пояснения
		SCALE="640" #размер 
		#Коды ошибок
		ERROPT="1" #неверная опция
		ENOVALUE="2" #не прописано значение опции
		ENOIMAGE="3" #Не дан входной файл
		ESCALE_ERR="4" #не получилось изменить изображение
		ENODEPS="5" #нерешенные зависимости
		ESHIT="265" #маловероятная ошибка' > $RC
fi
# считываем конфиг файл
. $RC
 
#Проверка наличия необходимых компонентов
which convert &> /dev/null
if [ $? -gt 0 ]; then
  echo 'Для корректной работы программы требуется пакет "ImageMagic"' 1>&2
  exit $ENODEPS
fi
 
 
motivator_help() {
cat << EOF
$MYNAME - Генератор демотиваторов
Использование:
  $MYNAME -i КАРТИНКО [-o КАРТИНКО] [-h ТЕКСТ] [-t текст]
  [-f ШРИФТ] [-F ШРИФТ] [-s РАЗМЕР] [-S РАЗМЕР] [-C ЧИСЛО]
Опции:
  -H - Показать эту справку
  -i - Исходное изображение
  -h - Текст заголовка
  -t - Текст пояснения
  -o - Выходной файл
  -F - Шрифт заголовка
  -f - Шрифт пояснения
  -S - Размер заголовка
  -s - Размер пояснения
  -C - Размер изображения
Для изменения параметров по умолчанию, редактируйте файл $RC
EOF
} 
 
motivator_getopts() { 
while getopts ":i: h: t: o: f: F: s: S: C: H" optname; do #получаем аргументы
	case "$optname" in
		"i") IMAGE="${OPTARG}" ;;
		"h") HEAD_TEXT="${OPTARG}" ;;
		"t") TERM_TEXT="${OPTARG}" ;;
		"o") DEST="${OPTARG}" ;;
		"f") T_FONT="${OPTARG}" ;;
		"F") H_FONT="${OPTARG}" ;;
		"s") T_SIZE="${OPTARG}" ;;
		"S") H_SIZE="${OPTARG}" ;;
		"C") SCALE="${OPTARG}" ;;
		"H") motivator_help; exit 0 ;;
		"?") echo "нет такой опции \"${OPTARG}\"!. Используйте -H для справки" 1>&2; exit $ERROPT ;;
		":") echo "Не указан аргумент для опции \"${OPTARG}\"" 1>&2; exit $ENOVALUE ;;
		*)   echo "Неизвестная ошибка. Обратитесь к разработчику" 1>&2; exit $ESHIT ;;
	esac
done
 
#Проверяем наличие входного файла
if [ -z "${IMAGE}" ]; then
  echo -e "дайте мне исходную картинку!\n" 1>&2
  motivator_help
  exit $ENOIMAGE 
fi
 
}
 
#/*Конец секции функций*/
#main ()
motivator_getopts "${@}" #получаем таки аргументы
 
#Изменяем размер
#
convert -scale "${SCALE}" "${IMAGE}" " "${DEST}" &> /dev/null
if [ $? -gt 0 ]; then
  echo "Ошибка изменения размера изображения" 1>&2
  exit $ESCALE_ERR
fi
 
#Делаем рамку
mogrify -bordercolor black -border 2 \
        -bordercolor white -border 2 \
        -bordercolor black -border 70x0 "${DEST}"
 
#Пишем заголовок
if [ -n "${HEAD_TEXT}" ]; then
montage -geometry +0+0 -background black -fill white \
        -font "${H_FONT}" \
        -pointsize "${H_SIZE}" -label "${HEAD_TEXT}" "${DEST}" "${DEST}"
fi
 
#Пишем пояснение
if [ -n "${TERM_TEXT}" ]; then
montage -geometry +0+0 -background black -fill white \
        -font "${T_FONT}" \
        -pointsize "${T_SIZE}" -label "${TERM_TEXT}" "${DEST}" "${DEST}"
fi
 
#Если был заголовок или пояснение, делаем поля
if [ -n "${HEAD_TEXT}" -o -n "${TERM_TEXT}" ]; then
  mogrify -bordercolor black -border 5x45 "${DEST}"
fi
 
exit 0 #все хорошо, закончили. Уходим отсюда!

спасибо за долготерпение, любители демотивационных постеров. Извините еще раз за то, что за быдлокод творится выше.

Ramok - огромное спасибо за подсказку о пакете. Очень удобный. У меня Manrdiva, убунту я органически не перевариваю за то, что считает себя умнее юзера. К тому же, скажем прямо - кеды под нее убоги, а гном лично я не очень люблю. /*Это утверждение ИМХО и не призывает к началу дискуссии в топике о том, какой дистрибутив круче.*/до Дебиана я, пожалуй, еще не дорос, я все-таки пока пионерия и ламер. Страшновато переходить на "взрослые" дистры. Хотя, в принципе, для настройки системы под себя уже успешно использую vim "конфигурационный файл". Тем не менее, я успешно прикрутил к ней dpkg, apt-rpm, репы PLF и все необходимое для сборки пакетов руками. После вдумчивой заточки напильником под себя, дистрибутив радует меня проверенными обновлениями, хорошей поддержкой виндовых приложений, неплохим репом и свежими проприетарными дровами. Лично мне нравится)) Пробовать что-то еще боюсь, может быть потом.

перенес код в совет, по мелочам поправил
так держать Ж:-)

Большое спасибо ) Только вот оба кодера облажались, Ведь видно же, подсветка синтаксиса даже затупила. Лишнюю кавычку сунул. Вот, выкладываю релиз 0.4 версии :) Теперь все верно, заодно еще раз по мелочам прошелся по коду, нормализовал оформление, синтаксис ерунды и комментирование, убрал незамеченные раннее остатки слэнга в выводах (писалось в качестве теста своих возможностей, для публикации вообще не планировалось. Но результат понравился, и мы имеем то, что мы имеем.

#!/bin/sh
# Demotivation by William Meth
# ver. 0.4 Copyleft (C) 2009 BSD license
#
# Отправляйте Ваши замечания и предложения на veyko2002'at'gmail.com
#
# Thanks to:
#   ramok by http://linsovet.com
#       code cleaning
#
# TODO: Сделать так чтобы опции решали необязательные параметры, а синтаксис
#       сводился к виду demotivation [-HoFfSsC ] "входящее изображение" "текст
#       заголовка" "текст пояснения" 
 
 
# Коды ошибок
ERROPT="1"     # Неверная опция
ENOVALUE="2"   # Не прописано значение опции
ENOIMAGE="3"   # Не дан входной файл
ESCALE_ERR="4" # Не получилось изменить изображение
ENODEPS="5"    # Нерешенные зависимости
ESHIT="265"    # Маловероятная ошибка
#несколько технических переменных
MYNAME=`basename $0` #получаем имя скрипта
RC=$HOME/.${MYNAME}rc #Место нахождения конфига.
 
 
#Создаем файл ресурсов, если еще не существует.
#Пожалуйста, не изменяйте свои параметры тут! Для этого есть конфиг.
if [ ! -f "$RC" ]; then
    cat << END_OF_RC > $RC
DEST="dem\$(date +%N).png" # Имя файла
H_FONT="/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf" # Шрифт заголовка
T_FONT="/usr/share/fonts/TTF/dejavu/DejaVuSans.ttf" # Шрифт пояснения
H_SIZE="64" # Размер заголовка
T_SIZE="32" # Размер пояснения
SCALE="640" # Размер 
END_OF_RC
fi
 
 
# считываем конфиг файл
. $RC
 
 
#Проверка наличия необходимых компонентов
which convert &> /dev/null
if [ $? -gt 0 ]; then
  echo 'Для корректной работы программы требуется пакет "ImageMagic"' 1>&2
  exit $ENODEPS
fi
 
 
motivator_help() {
cat << END_OF_HELP
$MYNAME - Генератор демотиваторов
Использование:
  $MYNAME -i КАРТИНКА [-o КАРТИНКА] [-h ТЕКСТ] [-t текст]
  [-f ШРИФТ] [-F ШРИФТ] [-s РАЗМЕР] [-S РАЗМЕР] [-C ЧИСЛО]
Опции:
  -H - Показать эту справку
  -i - Исходное изображение
  -h - Текст заголовка
  -t - Текст пояснения
  -o - Выходной файл
  -F - Шрифт заголовка
  -f - Шрифт пояснения
  -S - Размер заголовка
  -s - Размер пояснения
  -C - Размер изображения
Для изменения параметров по умолчанию, редактируйте файл $RC
END_OF_HELP
} 
 
 
motivator_getopts() { 
while getopts ":i: h: t: o: f: F: s: S: C: H" optname; do #получаем аргументы
	case "$optname" in
		"i") IMAGE="${OPTARG}" ;;
		"h") HEAD_TEXT="${OPTARG}" ;;
		"t") TERM_TEXT="${OPTARG}" ;;
		"o") DEST="${OPTARG}" ;;
		"f") T_FONT="${OPTARG}" ;;
		"F") H_FONT="${OPTARG}" ;;
		"s") T_SIZE="${OPTARG}" ;;
		"S") H_SIZE="${OPTARG}" ;;
		"C") SCALE="${OPTARG}" ;;
		"H") motivator_help; exit 0 ;;
		"?") echo "нет опции \"${OPTARG}\"! Используйте -H для справки" 1>&2; exit $ERROPT ;;
		":") echo "Не указан аргумент для опции \"${OPTARG}\"" 1>&2; exit $ENOVALUE ;;
		  *) echo "Неизвестная ошибка" 1>&2; exit $ESHIT ;;
	esac
done
 
 
#Проверяем наличие входного файла
if [ -z "${IMAGE}" ]; then
  echo -e 'дайте мне исходную картинку!\n' 1>&2
  motivator_help
  exit $ENOIMAGE 
fi
}
 
 
#------Основной код------
 
#получаем аргументы
motivator_getopts "${@}" 
 
#Изменяем размер
convert -scale "${SCALE}" "${IMAGE}" "${DEST}" &> /dev/null
if [ $? -gt 0 ]; then
  echo 'Ошибка изменения размера изображения' 1>&2
  exit $ESCALE_ERR
fi
 
#Делаем рамку
mogrify -bordercolor black -border 2 \
        -bordercolor white -border 2 \
        -bordercolor black -border 70x0 "${DEST}"
 
#Пишем заголовок
if [ -n "${HEAD_TEXT}" ]; then
montage -geometry +0+0 -background black -fill white \
        -font "${H_FONT}" \
        -pointsize "${H_SIZE}" -label "${HEAD_TEXT}" "${DEST}" "${DEST}"
fi
 
#Пишем пояснение
if [ -n "${TERM_TEXT}" ]; then
montage -geometry +0+0 -background black -fill white \
        -font "${T_FONT}" \
        -pointsize "${T_SIZE}" -label "${TERM_TEXT}" "${DEST}" "${DEST}"
fi
 
#Если был заголовок или пояснение, делаем поля
if [ -n "${HEAD_TEXT}" -o -n "${TERM_TEXT}" ]; then
  mogrify -bordercolor black -border 5x45 "${DEST}"
fi
 
exit 0 #все хорошо, закончили. Уходим отсюда!

Привет всем! А можно пошаговую инструкцию как установить этот скрипт?
Я просто в этом не шарю, мой сайт rusdemotivator.ru и мне очень нужно чтобы посетители могли создавать демотиваторы на сайте! Движок у меня dle
Буду благодарен ($-договоримся) если ктонибудь поможет!
Пишите на мыло

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.