LINUX.ORG.RU

image viewer simply на bash

 , ,

image viewer simply на bash

0

2

Хочу представить простенький просмотрщик изображений на bash. Накропал его сам и может он не имеет практического применения,но все же. Конечно там возможно много сделать лучше и проще. Как говорится как есть))

#!/bin/bash

export tmp_num="/tmp/numbegin"
[ ! -f "$tmp_num" ] && echo "1" > "$tmp_num"
export file_image="/tmp/file_image" 
[ ! -f "$file_image" ] &&  find / -xdev  -type f -name "*.png" -or -name "*.svg"  -or -name "*.jpg"  >  /tmp/file_image  
 
export col_image=$(cat $file_image | wc -l)
export max_stroke=$(grep -c $ "$file_image" | (read a; echo $(( ($a/300)*300+1 ));))
export FILE_PATH=$(realpath "$0") 
export catnum=$(cat "$tmp_num")
  function IMAGE_FILE () { 
begin="$1" 
begin="$catnum"
IFS=$'\n'
i="$begin"  
 
for file_name in $(sed -n "${begin},$((${begin} + 299))p" $file_image) 
  do
#size=$(exiv2 $file_name 2>/dev/null | awk ' NR==2 {printf("%.2f", sum ($4 / 1024)); print "Kb"}; NR==4 {print $4 "x" $6 "px"}' | tr '\n' ' ') --text=\"$size\"yad  --undecorated --image=\"$file_name\" --text=\"$file_name\" --selectable-labels  
 if (( "$i % 30" == 0 )) && [[ "$i" -le $((${begin} + 299-30)) ]] ; then num="</hbox><hbox>"; else num=""; fi
  echo "<button tooltip-text=\"$i $file_name\"><input file>\"$file_name\"</input><action>xdg-open  \"$file_name\"</action><height>30</height><width>30</width></button> $num"
  i=$((i + 1))
done
}
export -f IMAGE_FILE 
 
export MAIN_DIALOG_IMAGE='<window window-position="1" title="Галерея  bash"><vbox><hbox>'`IMAGE_FILE $begin`'</hbox><hbox space-expand="true" space-fill="true">
<button label="start">
<action>echo "1" > "$tmp_num"</action>
<action>$FILE_PATH $begin &</action></button>

<button label="'"$catnum"' prev">
<action>if [ "$catnum" -gt 1 ]; then begin=$(($catnum - 300)); echo "$begin" > "$tmp_num"; else begin=1; echo "1" > "$tmp_num"; fi</action>
<action>$FILE_PATH $begin &</action></button>

<button label="next '"$catnum"' - '"$(( $catnum + 299 ))=$col_image"'">
<action>if [[ "$catnum" -lt "$max_stroke" ]]; then begin=$(($catnum + 300)); echo "$begin" > "$tmp_num"; else begin=1; echo "1" > "$tmp_num"; fi</action>
<action>$FILE_PATH $begin &</action></button>
</hbox>
</vbox></window>'

gtkdialog --program=MAIN_DIALOG_IMAGE &
 
 PID_SUM=$(ps | grep "MAIN_DIALOG_IMAGE" | grep -v grep | awk '{print $1}' | wc -l) 
  PID=$(ps -eo pid,cmd | grep "MAIN_DIALOG_IMAGE" | grep -v grep | awk '{print $1}' | head -1)
  [ "$PID_SUM" -gt 1 ] && kill $PID
[ "$catnum" -ge "$max_stroke" ] && echo "1" > "$tmp_num" && $FILE_PATH $begin &

Хотел чтобы список был больше,но long arg list не дал это сделать. ps Не имею ни какого образования в программировании.



Проверено: anonymous_incognito ()
Последнее исправление: anonymous_incognito (всего исправлений: 4)

Не имею ни какого образования в программировании.

будто первые программисты его имели или же большинство нынешних синьоров мышевозов с опытом +20 лет

rtxtxtrx ★★
()

Запустил у себя. Роет весь винт. Инструкции нет к нему? Обычно бывает хоть какая-то.

./img.sh: строка 43: gtkdialog: команда не найдена

AnonymUser
()
Последнее исправление: AnonymUser (всего исправлений: 1)
Ответ на: комментарий от x22

Уже есть timg (который, помимо псевдографики, поддерживает протоколы iTerm и Kitty) и img2sixel (для XTerm и других эмуляторов, поддерживающих sixel).

Bass ★★★★★
()
Ответ на: комментарий от Bass

timg (который, помимо псевдографики, поддерживает протоколы iTerm и Kitty)

chafa уже тоже.

dataman ★★★★★
()
Ответ на: комментарий от Bass

Уже есть timg …

А можно и на bash + sed + xterm/rxvt без sixel. Остается переписать на bash resize/convert в xpm, и вот оно щастье:

https://i.postimg.cc/s25T3q50/t1.png

#!/usr/bin/env bash

inf=$1 
test "X$inf" != "X" && test -s $inf \
&& w=$(xwininfo -id $( env | sed '/WINDOWID=/!d;s,^.*=,,' ) | sed '/^[ ]*-geometry/!d;s,^[ ]*-geometry [ ]*\([0-9][0-9]*\)x.*$,\1,') \
&& test "X$w" != "X" -a $w -gt 1 && convert $inf -resize ${w}x${w}\> tmp.xpm || exit 1

{
cat <<EOF
#!/usr/bin/env bash

declare -A hh

_h(){ 
	local s="\$1" c="\$2" rgb=
	test "X\${c:0:1}" = "X#" && { 
		eval \$( 
		printf "rgb=\"\\\\033[48;2;%d;%d;%dm \\\\033[0m\"" 0x\${c:1:2} 0x\${c:3:2} 0x\${c:5:2} 
		) ; 
	} || {
		eval \$( 
		sed '/^[ ]*[0-9][0-9]* [ ]*[0-9][0-9]* [ ]*[0-9][0-9]*[[:space:]][[:space:]]*'\${c}'$/!d; 
			    s,^[ ]*\([0-9][0-9]*\) [ ]*\([0-9][0-9]*\) [ ]*\([0-9][0-9]*\)[[:space:]].*$,rgb=\"\\\\033[48;2;\1;\2;\3m \\\\033[0m\",;
				' /usr/X11R6/share/X11/rgb.txt 
		) ; 
	}
	hh["\${s}"]="\${rgb}"
}

_s() {
	local s="\$1" 
	local l=\${#s} i=0 c=
	while test \$i -lt \$l ; do
		c=\${s:\$i:\$nchar}
		echo -ne \${hh[\${c}]}
		i=\$(( \$i + \$nchar ))
	done
	echo
}
EOF

sed '1,3d; 
	 4s,^\"[ ]*\([0-9][0-9]*\)  *\([0-9][0-9]*\)  *\([0-9][0-9]*\)  *\([0-9][0-9]*\).*$,xs=\1\;ys=\2\;ncol=\3\;nchar=\4\;,;
	 5,/\/\* pixels \*\//{
		s,\`,\\\`,g; s,\$,\\\$,g;
		s/^\"\(.*\) c \(.*\)\",$/_h \"\1\" \"\2\"\;/;
	 };
	 s/^.*\* pixels \*.*$/pixels=;/;
	 /pixels=/,${
		s/^\"/_s \"/; 
		s/\`/\\\`/g; s,\$,\\\$,g;
		s/\",*$/\"\;/; 
	 };
	 /^}/d;
	' tmp.xpm  
} | bash 

rm -f tmp.xpm
x22 ★★
()
Ответ на: комментарий от AnonymUser

./img.sh: строка 43: gtkdialog: команда не найдена

Возможно gtk не установлена

Сколько я знаю, узнать есть ли в ос gtk можно по наличию библиотек.

find /usr -name "*libgtk*"

Сократить существенно количество картинок в выводе можно с помощью фильтрации одноименных файлов,которые в основном почти одинаковые, заменив find на эту строку

 find /usr -name "*.png" -o -name "*.jpg"   -o -name "*.svg" |  awk -F '/'   '{print  $0 "|" $NF}' | while read f; do echo "$f"; done | sort -t '|' -k2 -u | uniq -u   | awk -F'|'  '{print $1}'  > /tmp/file_image
nik120s
() автор топика
Последнее исправление: nik120s (всего исправлений: 1)
Ответ на: комментарий от nik120s

Возможно gtk не установлена

У меня тоже нет gtkdialog

$ fd 'gtkdialog' -p /usr                 
/usr/include/gtk-2.0/gtk/gtkdialog.h
/usr/include/gtk-3.0/gtk/gtkdialog.h
/usr/include/gtk-4.0/gtk/deprecated/gtkdialog.h
/usr/include/gtk-4.0/gtk/gtkdialogerror.h
dmitry237 ★★★★
()

Молодец, никого не слушай. Единственное, что лучше, конечно, писать на чистом shell, bash не у всех есть.

IPR ★★★★★
()
Ответ на: комментарий от IPR

Честно сказать я думал,что @sh,это неотъемлемая часть линукса. Можно увеличить вывод до 1000 картинок за раз,если button заменить на pixmap,убрать action,тем самым сократить длину командной строки. С shell пока не знаю как работать.

nik120s
() автор топика
Ответ на: комментарий от nik120s

Еще проще посмотреть , какие картинки есть в системе, на одной странице, с помощью браузера. Это работает в терминале.Вместо /opt/firefox/firefox вставить свой путь запуска браузера.

echo '<html > <head>
<title>IMAGE</title>
<style>
img { height: 30px;width: 30px; margin: 8px;}
img:hover {transform: scale(3);}
</style>
 </head>
<body>
<div>' > /tmp/html_img.html
find / -xdev -name "*.png" -o -name "*.jpg"   -o -name "*.svg" |  awk -F '/' '{print  $0 "|" $NF}' | while read f; do echo "$f"; done | sort -t '|' -k2 -u | awk -F'|' '{print $1}' | while read img; do 
echo '<img src="'"$img"'" alt="'"$img"'" onclick="window.open(this.src)">'; done >> /tmp/html_img.html 
echo ' </div> 
</body></html>' >> /tmp/html_img.html
/opt/firefox/firefox /tmp/html_img.html
nik120s
() автор топика

А каким местом это «на bash»? Он прежде всего на gtk, ибо без gtkdialog ничего не получится. А то так и OCR «на bash» можно написать — через convert предобработку изображений и дальше скрамливать их tesseract`у.

Smacker ★★★★★
()

Не имею ни какого образования в программировании

Для меня это непостижимо. Программирование - нечто сродни китайскому языку. Не представляю, если бы ты знал какие-то ЯП - что бы ты тогда писал… Блин, круто.

Gonzo ★★★★★
()
Ответ на: комментарий от Smacker

Он прежде всего на gtk, ибо без gtkdialog ничего не получится.

В таком случае, все программы в Линуксе на Си, ибо без ядра ничего не получится.

А здесь программа на bash, использует библиотеку GTK для отрисовки.

monk ★★★★★
()
Ответ на: комментарий от Gonzo

Для меня это непостижимо. Программирование - нечто сродни китайскому языку.

Для меня программирование ,особенно неинтерпретируемое тоже проблематично,потому что последнее,что я проходил - был фортран на перфокартах.

А php,sh,html,js полегче для меня.

nik120s
() автор топика
Ответ на: комментарий от nik120s

Утилита то небольшая, но лучше было вставить в начало скрипта проверку её наличия в системе, а то получается, что в начале долгое find, а потом ругательство, что команда не найдена.

if ! command -v gtkdialog >/dev/null 2>&1 ; then 
   echo "This script requires gtkdialog but it's not installed. Aborting."
   exit 1
fi

Ну, и фиксированные имена временных файлов как-то неправильно, mktemp или вобще создавать $RANDOM подкаталог в /tmp https://mywiki.wooledge.org/BashFAQ/062

mky ★★★★★
()
Ответ на: комментарий от monk

использует библиотеку GTK для отрисовки.

С точки зрения распределения нагрузки для создания конечного результата, GTK делает львиную долю всего, а баш так, кое-что для разогрева.

Smacker ★★★★★
()
Ответ на: комментарий от Smacker

Так нынче 99% программ такие, где львиную долю всего делают библиотеки.

monk ★★★★★
()
Ответ на: комментарий от mky

Это образец ,можно своего добавить ,убавить,не нужно ничего компилировать.

Да проверка наличия не помешает, так как настрогали много различных осей,где чего-нибудь да нет.

nik120s
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.