本文适用于想把自己收藏的图片放到系统目录中的同学,因为如果直接把图片放系统目录中,在设置界面中是看不到新添加的图片的。
环境及相关目录文件说明:
系统:centos7(这个应该不是重点,基本所有的系统应该都适用的)。
linux默认背景图片存放位置:/usr/share/backgrounds/gnome目录
背景图片的配置文件目录:/usr/share/gnome-background-properties
用于生成配置的脚本文件名:create_back_ground.sh
简单介绍:
用以识别出背景图片的配置文件目录:/usr/share/gnome-background-properties,系统自带的背景图片都在该目录的gnome-backgrounds.xml文件中有登记。我们可以按照相应的格式,创建新的配置文件,添加自己收藏图片的相关定义。下面会提供一个脚本,用于生成这种文件。
示例:
在/usr/share/backgrounds/目录中创建一个文件夹,比如Wallpapers,把自己收藏的图片放到这个文件夹中,然后执行./create_back_ground.sh /usr/share/backgrounds/Wallpapers > windows.xml,生成配置文件。本示例中从windows系统中拷贝相关图片,你也可以从mac中拷贝壁纸,放到Wallpaper目录中。然后把生成的windows.xml文件移动到/usr/share/gnome-background-properties目录中,之后打开系统设置,就应该可以找到新添加的图片了。
用到的脚本create_back_ground.sh:
#!/bin/bashif [ $# -ge 1 ];then paths=$1 length=`expr length $paths` endwith=`echo $paths |cut -c $length-$length` if [ ! $endwith = "/" ];then paths=$paths/ fielse paths="/usr/share/backgrounds/gnome/"fiecho " "echo ""echo -n ""for i in $paths* ;do fnamext=`basename $i` ext=`echo $fnamext |awk -F \. '{print $NF}'` fname=`basename $i .$ext` echo -n " "$fname $fname $fname $paths$fnamext zoom #ffffff #000000 "doneecho ""echo "
如果不指定目录,默认根据/usr/share/backgrounds/gnome目录中的图片,生成配置文件。
脚本自适应扩展名,如果你放一个*.txt的文档,脚本同样会生成相关记录,这肯定不是你想要的,所以要避免放非图片格式到相应文件夹中。
目录要使用绝对路径指定。
如果有需要设置动态切换壁纸,可以修改/usr/share/backgrounds/default.xml文件,指定在那些图片中切换,及持续时间。我们可以用来指定上午、下午和晚上使用的桌面背景,以适应环境,还是很不错的。同样完成之后,可以在系统设置界面中,选择设定的自动切换方案。右下角带有时钟图标,说明选中后,会根据时间变化自动更新壁纸,如图:
另附一个C语言实现的小程序,功能、用法和脚本完全相同,需要在linux系统中编译,大致计算了下运算时间,比脚本要快35倍左右。
#include#include #include #include #include #include typedef struct name_ext{ char* name; char* ext;}name_ext;char* path;name_ext* splitstr(const char* str){ if(str[0] == '.' || strlen(str)<=2) return NULL; int len,sublen,n; name_ext* basic=(name_ext*)malloc(sizeof(name_ext)); basic->ext=rindex(str,'.'); if(basic->ext == NULL) return NULL; else{ len=strlen(str); sublen=strlen(basic->ext); n=len-sublen; basic->name=(char*)malloc(n+1); strncpy(basic->name,str,n); basic->name[++n]='\0'; return basic; } return NULL;}void formatdata(name_ext* afile){ printf(" \n"); printf("\t %s \n",afile->name); printf("\t%s\n",afile->name); printf("\t %s\n",afile->name); printf("\t %s%s%s \n",path,afile->name,afile->ext); printf("\tzoom \n"); printf("\t#ffffff \n"); printf("\t#000000 \n"); printf(" \n");}int main(int argc,char* argv[]){ char* newpath; name_ext* af; struct dirent *dircontent; if(argc >= 2) path=argv[1]; else path="/usr/share/backgrounds/gnome/"; int length=strlen(path); if(path[length-1] != '/'){ newpath=(char*)malloc(length+1); strcpy(newpath,path); path=strcat(newpath,"/"); } DIR* dir=opendir(path); if(dir == NULL){ if(newpath)free(newpath); return; } printf(" \n"); printf("\n"); printf("\n"); while(dircontent=readdir(dir)) { af=splitstr(dircontent->d_name); if(af){ formatdata(af); free(af->name); } } printf(" \n"); closedir(dir); if(newpath)free(newpath); return 0;}