В общем, из-за одного моего хобби, часто приходится выкладывать скриншоты. Но, к сожалению, бесплатные хостинги изображений имеют свойство тормозить (часто слышу такое в сторону радикала), а иногда даже умирать (тот же sendpic.ru, частично ipicture.ru).
Решением этой проблемы, как мне кажется, является сервис dropbox’а — быстрый, бесплатный (до 2 GB) и вроде популярный (а значит надёжный). Да только превьюшки автоматом он делать не умеет. Вот и пришлось написать скрипт, который, используя imagemagick, создаёт thumbnail после чего публикует оригинал и превью, а потом возвращает сформированный bb-код уже готовый для вставки на форум phpBB-типа.
Собственно сам скрипт
(комментарии местами могут быть лишние, сразу прошу прощения за избыточность; «линия» — это то что поверх изображения рисуется, не знал как назвать корректнее):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
#!/bin/bash
####################################################### # Конфигурация # ####################################################### #################### # Общие параметры # #################### F_DPDIR="/home/kaener/Dropbox/Public/img" # папка дропбокса, в которую мы будем кидать оригинал картинки (без слэша вконце) T_DPDIR="/home/kaener/Dropbox/Public/img/thumb" # папка дропбокса в которую мы будем кидать превьюшку (без слэша вконце)
ID=3297058 # id вашего аккаунта у дропбокса
T_HEIGHT=100 # желаемая высота превьюшки T_WIDTH=180 # желаемая ширина превьюшки
IF_SIZE=1 # вставлять ли размер картинки, в текст на превьюшке. (1 — true. 0 — false) IF_DATE=1 # создавать ли папку для картинки с текущей датой (позволяет хоть как-то их сортировать). (1 — true. 0 — false)
############################### # Параметры линии под текстом # ############################### IF_LINE=1 # делать ли вообще эту линию. (1 — true. 0 — false)
T_LINE_HEIGHT=16 # высота линии, в px T_LINE_COL="#00234aa6" # цвет линии внизу превьюшки вместе с альфа каналом (последние два знаки задают прозрачность)
############################## # Параметры текста на превью # ############################## T_STP=4 # величина отступа от нижнего края картинки до текста, в px
T_WIDTH_SYMB=6 # ширина одного символа в выбраном шрифте T_TEXT_FONT="DejaVu-Sans-Mono-Bold" # шрифт надписи (если изменяете этот параметр, измените ещё и ширину символа <t_width_symb> т.к. может пропасть центровка надписи) T_TEXT_SIZE=11 # кегль шрифта (если изменяете этот параметр, измените ещё и ширину символа </t_width_symb><t_width_symb> т.к. может пропасть центровка надписи)
T_TEXT_COL="white" # цвет текста
####################################################### # Собственно тело скрипта # ####################################################### ############################# # Проверка указанного файла # ############################# F_NAME="$1" F_OK=1
while < $F_OK -le 6 > do if < ! -e "$F_NAME" > || < ! -f "$F_NAME" > || < ! -r "$F_NAME" > # если есть проблемы (не сущствует, было указано на каталог, не доступен для чтения) then echo "Error! Some problem with file $F_NAME. Try chose another." if < -n "`command -v zenity`" > then F_NAME=`zenity --file-selection` # просим выбрать нужный else exit 1 fi F_OK=$((F_OK+1)) if < "$F_OK" -ge 3 > # три ошибки и на выход then exit 1 fi else F_OK=10 fi done
echo "Converting and thumbnailing $F_NAME"
###################### # Готовим переменные # ###################### if < -z "`command -v convert`" > then echo "Imagemagick doesn't seem to install properly. Install it and try again." exit 1 fi F_S_NAME=`basename "$F_NAME"` # только имя файла (без пути) T_NAME=${F_S_NAME%%.png}_thumb.png # имя превью (к оригинальному имени добавляеться суффикс "_thumb") T_S_NAME=`basename "$T_NAME"` # только имя превью (без пути) F_WIDTH=`identify $F_NAME | awk '{print $3}' | sed 's/<^0-9>/ /g' | awk '{print $1}'` # узнаём ширину изображения F_HEIGHT=`identify $F_NAME | awk '{print $3}' | sed 's/<^0-9>/ /g' | awk '{print $2}'` # узнаём высоту изображения F_SIZE=`identify $F_NAME | awk '{print $7}'` # узнаём размер изображения
F_RATIO=`echo "scale=0; ($F_HEIGHT / $F_WIDTH) * 10000 " | bc` # узнаём соотношение сторон изображения
##################### # Создаём превьюшку # ##################### if < $F_RATIO -lt 4000 > # если соотношение высоты к ширине изображения, меньше 0.4 (значение получено эмпирически) т.е. картинка широкая, но не высокая (пример: ширина=480, высота=180, RATIO=0.35) then `convert "$F_NAME" -quality 0 -resize "$T_WIDTH" "$T_NAME" # создаём thumbnail по максимальной ширине, без указания граничной высоты` elif < $F_RATIO -ge 4000 > # если соотношение высоты к ширине изображения, больше или равно 0.4 (значение получено эмпирически) т.е. картинка высокая, или средняя, но не широкая (пример: ширина 480, высота 216, RATIO=0.45) then `convert "$F_NAME" -quality 0 -resize "x$T_HEIGHT" "$T_NAME" # создаём thumbnail по максимальной высоте, без указания граничной ширины` fi ######################### # Узнаём что получилось # ######################### T_WIDTH=`identify $T_NAME | awk '{print $3}' | sed 's/<^0-9>/ /g' | awk '{print $1}'` T_HEIGHT=`identify $T_NAME | awk '{print $3}' | sed 's/<^0-9>/ /g' | awk '{print $2}'`
################################ # Готовим переменные для линии # ################################ if < "$IF_LINE" -eq 1 > # при условии, что вообще что-то надо будет делать then if < "$T_HEIGHT" -gt "$T_LINE_HEIGHT" > # если высота превьюшки больше желаемой высоты линии, то then T_LINE_POS=`echo "scale=0; $T_HEIGHT - $T_LINE_HEIGHT" | bc` # узнаём позицию верхней границы линии на превьюшке else IF_LINE=0 # иначе рисовать её не будем fi if < "$IF_SIZE" -eq 1 > # если прибавлять к надписи размер, то then T_TEXT=`printf $F_WIDTH'x'$F_HEIGHT' ('$F_SIZE')'` # формируем текст T_PIX=`printf $F_WIDTH'x'$F_HEIGHT' ('$F_SIZE')' | wc -m` # узнаём количество символов T_PIX=`echo "scale=0; $T_PIX * ($T_WIDTH_SYMB + 1)" | bc` # узнаём размер надписи в px else T_TEXT=`printf $F_WIDTH'x'$F_HEIGHT` # формируем текст T_PIX=`printf $F_WIDTH'x'$F_HEIGHT | wc -m` # узнаём количество символов T_PIX=`echo "scale=0; $T_PIX * ($T_WIDTH_SYMB + 1)" | bc` # узнаём размер надписи в px fi if < $T_WIDTH -lt $T_PIX > # если ширина thumbnail'а меньше ширины текста, то then IF_LINE=0 # рисовать линию не будем fi T_WIDTH_TEXT=`echo "scale=0; ($T_WIDTH - $T_PIX) / 2" | bc` # узнаём положение первого пикселя надписи T_HEIGHT_TEXT=`echo "scale=0; $T_HEIGHT - $T_STP" | bc` # узнаём положение нижнего пикселя надписи fi
############################################### # Выполняем добавление этой линии на thumnail # ############################################### if < $IF_LINE -eq 1 > then `convert "$T_NAME" -fill $T_LINE_COL -draw "rectangle 0,$T_HEIGHT,$T_WIDTH,$T_LINE_POS" -font $T_TEXT_FONT -pointsize $T_TEXT_SIZE -fill $T_TEXT_COL -draw "text $T_WIDTH_TEXT,$T_HEIGHT_TEXT '$T_TEXT'" -append "$T_NAME"` fi
##################### # Файловые операции # ##################### if < "$IF_DATE" -eq 1 > then DIR_DATE=`date +%d%m%Y` if < ! -e "$F_DPDIR/$DIR_DATE" > then `mkdir "$F_DPDIR/$DIR_DATE"` fi if < ! -e "$T_DPDIR/$DIR_DATE" > then `mkdir "$T_DPDIR/$DIR_DATE"` fi F_DPDIR=`printf $F_DPDIR'/'$DIR_DATE` T_DPDIR=`printf $T_DPDIR'/'$DIR_DATE` DIR_DATE=`echo $DIR_DATE'/'` fi
`cp -f "$F_NAME" "$F_DPDIR"` # копируем исходное изображение `mv -f "$T_NAME" "$T_DPDIR"` # переносим thumbnail
######################## # Получение результата # ######################## if < -n "`ls -l "$F_DPDIR" | grep "$F_S_NAME"`" > && < -n "`ls -l "$T_DPDIR" | grep "$T_S_NAME"`" > then T_LINK=`dropbox puburl "$T_DPDIR/$T_S_NAME"` F_LINK=`dropbox puburl "$F_DPDIR/$F_S_NAME"` if < "`dropbox status | grep "isn't running"`" > then T_LINK="http://dl.getdropbox.com/u/$ID/img/thumb/$DIR_DATE/$T_S_NAME" F_LINK="http://dl.getdropbox.com/u/$ID/img/$DIR_DATE/$F_S_NAME" elif < -z "`echo $T_LINK | grep http`" > || < -z "`echo $F_LINK | grep http`" > then echo "Error! Folders $F_DPDIR or/and $T_DPDIR aren't public." exit 1 fi else if < -n "`ls -l "$F_DPDIR" | grep "$F_S_NAME"`" > then echo "Error! Copy file failed." fi if < ! "`ls -l "$T_DPDIR" | grep "$T_S_NAME"`" > then echo "Error! Move thumbnail failed." fi exit 1 fi
#################### # Вывод результата # #################### echo "<url><img />$T_LINK</url>" # вывести получившийся bb-code в консоль
if < -n "`command -v xsel`" > then printf "<url><img />$T_LINK</url>" | xsel -ibp #скопировать получившийся bb-code в буфер обмена fi
###### # PS # ###### if < -n "`dropbox status | grep "isn't running"`" > then echo "P.S. Dropbox isn't running. Start it to begin sync." fi</t_width_symb>
|
Пример получившейся превью-картинки:
Учился на примерах из многих источников, в том числе и здешних. Всем авторам огромное спасибо за такую «заочную» помощь.
Также есть желание учиться дальше, потому жду здоровой критики и разумных предложений. =)
ADD:
Для вывода html-кода, вместо bb, надо заменить секцию «Вывод результата» на вот это:
|
#################### # Вывод результата # #################### echo "<a href=\"$F_LINK\"><img src=\"$T_LINK\" /></a>" # вывести получившийся html-code в консоль
if < -n "`command -v xsel`" > then printf "<a href=\"$F_LINK\"><img src=\"$T_LINK\" /></a>" | xsel -ibp #скопировать получившийся html-code в буфер обмена fi
|
Спасибо
antigluk за подсказку.
#!/bin/bash
fn=`scrot '/home/roma/Dropbox/Public/screen/%Y-%m-%d_%H-%M_$wx$h.png' -e 'echo $f'`
while < -z "`dropbox filestatus $fn | grep "up to date"`" >; do
sleep 1;
done
url="`dropbox puburl $fn`"
echo $url
echo $url | xsel -ib
zenity --info --title=webprintscreen.sh --text "Ссылка\n$url\nскопирована в буфер обмена"