数码相框
目录:
基于debian
以前用树莓派接显示器实现过一个简单的数码相框,可以利用sftp客户端通过WiFi上传要显示的照片,而树莓派使用fbi将这些照片以幻灯片的形式显示在显示器上。
fbi —— linux framebuffer imageviewer,不依赖图形界面,比如xorg。可以在字符界面下直接显示图片。
fbi必须要在本地执行,不能从远程ssh客户端执行。
后来fbi进化为fim —— fbi improved。
fim可以从远程ssh执行,它会检测主机能用的视频输出。
以下命令可以从远程ssh执行,在数码相框显示图片:
nohup fim -aqu -c 'while(1){sleep 1;next;}' img/ >/dev/null 2>&1 &
img/是存放图片的目录,此处可以有斜杠,也可以没有,可以用img/*,效果相同。
使用jobs可以查看当前后台正在执行的进程;用fg number命令可以将后台进程移到前台。然后按Ctrl+c就可以结束该进程了。
例如:
lidapeng@x61s:~$ nohup fim -aqu -c 'while(1){sleep 1;next;}' img/ >/dev/null 2>&1 &
[1] 3486
lidapeng@x61s:~$ jobs
[1]+ 运行中 nohup fim -aqu -c 'while(1){sleep 1;next;}' img/ > /dev/null 2>&1 &
lidapeng@x61s:~$ fg 1
nohup fim -c 'while(1){sleep 1;next;}' img/ > /dev/null 2>&1
^C
将此命令加入服务,使得系统启动后自动开始显示指定目录的照片:
首先编辑/etc/rc.local文件(默认没有,需要创建)。
加入以下行:
#! /bin/bash
nohup fim -aqu -c 'while(1){sleep 1;next;}' /home/lidapeng/img/ >/dev/null 2>&1 &
exit 0
- -a
自动调整大小
- -q
静默模式,不会显示状态栏等信息
- -u
以随机模式显示
- -c
执行命令
命令以引号包围。while(1){sleep 1;next;}表示无限循环,隔1秒显示下一个。
赋予此文件可执行权限:
chmod +x /etc/rc.local
启动rc-local服务:
systemctl start rc-local
系统重启后不需要登录任何账号即可显示指定目录中的图片。
若要终止,可以登录系统后执行以下命令:
systemctl stop rc-local
注意,此时显示屏还会继续显示图片,从登录到执行命令,基本属于盲打。
以上,也可以使用service rc-local stop|start|restart命令
以nohup方式执行此命令时有个问题需要解决:显示图片时会有个光标一直在闪,应该是登录提示符的下划线。
如果用户登录的话,可以设置shell变量来隐藏光标:
PS1="\[\033[?25l"
export PS1
对于fbi,则必须在主机本地执行:
fbi -a -t 1 -noverbose -u /home/pi/img/*
- -a
自动调整大小,小图片会被放大
- -t 1
时间间隔
- --noverbose
不显示详细信息,即:没有底部状态栏
且fbi不会去搜索目录,如果将img/*换成img或img/都会显示空黑页面。
尝试将以上命令加入到/etc/rc.local中,启动时提示:
ioctl VT_GETSTATE: Inappropriate ioctl for device(not a linux console?)
故而将其加入到某个用户的.bashrc文件中,然后再设定该用户自动登录,即可达到开机自动显示指定目录中的图片的效果。
如果图片文件有增减,可以使用以下命令强行将指定用户登出:
root@raspberrypi:/home/lidapeng# w
11:24:53 up 5 min, 2 users, load average: 0.49, 0.34, 0.16
USER TTY 来自 LOGIN@ IDLE JCPU PCPU WHAT
pi tty1 - 11:24 5:42 12.93s 12.46s fbi -a -t 1 --noverbose /home/pi/img/172
lidapeng pts/0 192.168.11.131 11:20 1.00s 1.57s 1.06s sshd: lidapeng [priv]
root@raspberrypi:/home/lidapeng# pkill -t tty1
在树莓派的raspbian中,如果用raspi-config设置某个用户自动登录,那么按照上述方法将其踢出的话该用户还会自动登录。
这间接实现了fbi刷新目录的目的。
按esc键可以退出图片显示。
实际上如果设置了指定用户自动登录,可以在该用户的~/.bashrc文件中写入以下两行中的任意一行:
fbi -a -t 1 -noverbose -u /home/lidapeng/img/* 按Esc退出
fim -aqu -c 'while(1){sleep 1;next;}' /home/lidapeng/img/ 按Ctrl+c退出,实际是打破while循环
基于FreeBSD
由于FreeBSD下并没有类似fbi的软件,也就是说,在纯文本界面下无法显示图片,只能在图形界面下显示图片。
目前想到的方法是利用slim自动登录进一个用户,然后在该用户的~/.xinit文件中调用feh播放图片。
此方法需要安装的软件有:
- xorg
实现xorg窗口
也可以仅安装xorg-minimal和xset。
- slim
实现自动登录
需要修改/usr/local/etc/slim.conf文件:
default_user freebsd FreeBSD的树莓派版默认的普通用户账号,密码也是freebsd
focus_password yes
auto_login yes 自动登录
修改/etc/rc.conf文件:
dbus_enable="yes"
slim_enable="yes"
- feh
显示图片
安装完成后修改root的~/.xinitrc文件,加入以下行:
xset -dpms s 0 0 & 此行取消xorg屏保
feh -zFD1 /home/freebsd/img 若使用dwm,需要指定feh的-Y选项隐藏鼠标指针
xset的-dpms选项禁用DPMS(能源之星)功能;
s 0 0选项将屏保时间设置为0秒,即不启用屏保。
使用命令xset -q可以查看当前生效的设置。(需要在x环境下)
以上完成后,开机过程结束就会开始播放照片。
远程登录重启slim服务可以重新播放照片。指定目录中照片有变更时可用此方法完成刷新动作。
在本地可以按Ctrl+Alt+F1~F8进入console模式(有一定概率不成功,可能需要多试几次),按Ctrl+Alt+F9返回播放模式。
但是FreeBSD不能识别树莓派的无线网卡,解决方法是使用有线,或者FreeBSD可识别的USB无线网卡。
综上,个人认为还是raspbian + fim的方式更适合做数码相框。
feh有趣的选项
feh的默认模式为幻灯片(slideshow)模式。
蒙太奇模式从文件列表中形成蒙太奇。生成的图像可以查看或保存,其大小可以受高度、宽度或两者的限制。
索引模式从文件列表中形成索引打印。图像缩略图与文件名、大小和尺寸一起显示。
缩略图模式类似于索引模式,但可以单机迷你图像并在新窗口打开选定的图像。
多窗口模式在多个窗口中显示图像。不要与大型文件列表一起使用。
列表模式不显示图片。它输出文件列表中文件的ls样式列表,包括图片信息,比如大小、像素、类型等。
- --auto-rotate
基于EXIF数据自动旋转图像,不会更改图像文件。
- -Z, --auto-zoom
自动缩放图片以适应全屏/固定几何模式。
- -x, --borderless
创建无边界窗口。
- --cache-size size
指定缓存大小(以MB为单位)。大小介于0到2048MB,默认为4MB。
- -P, --cache-thumbnails
启用缩略图缓存。缩略图保存在$XDG_CACHE_HOME/thumbnails。
仅当配置的缩略图大小不超过256x256像素时,才会缓存缩略图。
- -K, --caption-path path
指定包含图像标题的目录的路径。
如果在路径中找到字幕,将打开字幕,字幕将覆盖在显示的图像上。
例如:使用标题路径“captions/”和查看图像“images/foo.jpg”,将在“images/captions/foo.jpg.txt中查找标题。
- --conversion-timeout timeout
feh可以使用ImageMagick尝试将不可加载的文件转换成支持的格式。由于可能耗时较长,故默认禁止。
将timeout设置为负值表示启用它。零表示无限期尝试;正值表示指定超时的秒数。
- -F, --fullscreen
全屏。
- -Y, --hide-pointer
隐藏指针,用于幻灯片模式。
- -q, --quiet
静默模式,不报告失败加载的非致命性错误。
- -z, --randomiz
以幻灯片模式查看多个文件时,以随机方式播放图片。
每当幻灯片播放周期(从最后一个图像过渡到第一个图像)时,列表会重新随机化(即循环播放)。
- -r, --recursive
递归模式显示指定目录中的图片,包括子目录中的图片。
- --no-recursive
不递归显示子目录中的文件。此模式为默认。
有助于覆盖包含--recursive的主题。
- -R, --reload int
int秒后重新加载文件列表和当前图像。
可用于查看HTTP网络摄像头或经常更改的目录。
设置为0可禁用任何类型的自动重新加载。
如果删除了图像,feh将显示下一个图像或退出。
此设置将禁用基于索引的自动重新加载。蒙太奇、索引或缩略图模式下不支持重新加载。
- -n, --reverse
反转排序顺序。
此选项可以反转文件列表的顺序,例如,要按宽度顺序的逆序显示,可使用-nSwidth
- -D, --slideshow-delay float
在幻灯片模式下,指定自动更换幻灯片之间等待的秒数。
- -S, --sort sort_type
根据图像参数排序。
允许的排序类型有:name、filename、dirname、mtime、width、height、pixels、size、format。
对于name、filename、dirname、mtime之外的排序,需要预加载,会导致延迟。
mtime从最近修改的图片开始;width、height、pixels、size从最小值开始。
使用--reserse选项则动最旧或最大的开始,即反序。
手册中的示例:
- feh ~/Pictures
展示~/Pictures目录下所有照片
- feh -r ~/Pictures
递归展示~/Pictures目录下所有照片,包括子目录下的
- feh -rSfilename --version-sort ~/Pictuers
与上面相同,但按自然排序。
默认情况下,feh按名称排序展示照片,foo10.jpg会在foo2.jpg前面。但此例中会像人类预期的那样显示,即foo2.jpg在foo10.jpg前面。
- feh -t -Sfilename -E 128 -y 128 -W 1024 ~/Pictures
显示128x128像素缩略图,将窗口宽度限制为1024像素。
- feh -t -Sfilename -E 128 -y 128 -W 1024 -P -C /usr/share/fonts/truetype/ttf-dejavu/ -e DejaVuSans/8 ~/Pictures
同上,但启用缩略图缓存并使用较小的字体。
- feh -irFarial/14 -O index.jpg ~/Pictures
制作~/Pictures及其下所有目录的索引打印,使用14号Arial字体在每个缩略图下写入图像信息。将图像另存为index.jpg,不显示,退出即可。
注意,这甚至可以在没有运行X服务器的情况下工作。
- feh --unloadable -r ~/Pictures
递归打印~/Pictures下所有不可加载的图片。
- feh -f by_width -S width --reverse --list .
将目录中的所有图像按宽度写入列表,按宽度排序(最宽的图像优先)
- feh -w ~/Pictures/holidays
在自己的窗口中打开~/Pictures/holidays中的每个图像
- feh -FD5 -Sname ~/Pictures/presentation
显示~/Pictures/presentation图像,按名称排序、全屏显示,每隔5秒自动切换到下一张。
- feh -rSwidth -A "mv %F ~/images/%N" ~/Pictures
按照宽度顺序显示~/Pictuers中的图片,并将展示或的图片移动到~/images/中
- feh --start-at ~/Pictures/foo.jpg
从~/Pictures/foo.jpg开始显示图片
- feh --start-at ~/Pictures/foo.jpg ~/Pictures
同上
- feh --info "exifgrep '(Model|DateTimeOriginal|FNumber|ISO|Flash)' %F | cut -d . -f 4-" .
显示一些EXIF信息,由exifprobe/exifgrep提取
- feh --action 'rm %F' -rl --max-dimension 1000x800
递归地从当前目录中删除尺寸小于或等于1000x800像素的所有图像。
- feh -L '%w %h %f' | awk '{ if ($1 > $2) { print $0 } }' | cut -d ' ' -f 3- | feh -f -
在当前目录中显示横向图片(图像宽度大于高度)。
在许多桌面环境中,feh也可以用作背景设置器。
除非您传递--no-fehbg选项,否则它将编写一个脚本,将当前背景设置为~/.fehbg。
因此,要在每次启动X时恢复背景,可以将“~/.fehbg &”添加到X启动脚本中(例如~/.xinitrc)。
注意,写入~/.fehbg的命令行始终包括--no-fehbg选项,以确保它不会因X11屏幕布局或类似内容的差异而意外更改。
feh不支持设置GNOME shell桌面的壁纸。
对于--bg-center、--bg-fill和--bg-max,可以使用--geometry指定距屏幕一侧的偏移量,而不是将图像居中。
正值将从左侧/顶部偏移,负值将从底部/右侧偏移。+0和-0都是有效且不同的值。
请注意,除--bg-tile之外的所有选项都支持Xinerama。
例如,如果您连接了多个屏幕并使用例如--bg-center,feh将在每个屏幕上居中或适当偏移图像。
您甚至可以指定多个文件,在这种情况下,第一个文件在屏幕0上设置,第二个在屏幕1上设置,依此类推。
设置壁纸时,使用--no-xinerama将整个X显示屏视为一个屏幕。
您还可以使用--xinerama-index将feh用作特定屏幕的背景设置器。
- --bg-center
将文件置于背景中央。如果图片太小,将会被一个边界包围,如--image-bg所指定。
- --bg-scale
将文件放在背景中,不要重复,切掉东西或使用边框。但是纵横比也没有保留。
- --bg-fill
同上,但通过缩放图像直到其适合,保留纵横比。图像的水平或垂直部分将被切断。
- --bg-max
同上,但是,将图像缩放到最大尺寸,使其适合一侧带有边框的屏幕。可以使用--image-bg设置边框颜色。
- --bg-tile
平铺(重复)图像,以防图像对屏幕来说太小。
- --no-fehbg
不写~/.fehbg文件。
大概意思是创建一个~/.fehbg文件,里面包含feh命令即相关选项(必须包含--no-fehbg选项)。例如:
feh --no-fehbg -zFD1 ~/Picitures
然后在~/.xinitrc中加上以下行调用~/.fehbg文件:
~/.fehbg &
以上可以实现每秒更换一张桌面背景,但按ESC键会退出feh播放模式,显示原桌面背景。
另外,还需要设置slim以daemon方式运行,否则feh显示的图片会在最前台,无法对电脑进行任何操作。
修改/usr/local/etc/slim.conf文件,取消以下行的注释,然后重启slim服务:
deamon yes
debian下xorg禁用屏幕保护的方法
以下方法来自Disable suspend and hibernation
/etc/xorg.conf(默认没有此文件)
Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
重启xorg后登录系统,执行xset q命令可以看到:
DPMS (Energy Star):
Standby:0 Suspend:0 Off:0
DPMS is Enable
Monitor is On
亲测可用。
屏蔽相关服务
# systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
登录系统后执行xset q命令可以看到:
DPMS (Energy Star):
Standby:600 Suspend:600 Off:600
DPMS is Enable
Monitor is On
不确定可用。
要启用以上服务,可以将上述命令中的mask更改为unmask。
修改/etc/systemd/sleep.conf
此方法适用于Debian10和更新版本。
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
此方法似乎无效