无聊啦,分享个今天写的图片批处理脚本(增加新脚本)

sh/bash/dash/ksh/zsh等Shell脚本
回复
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34

无聊啦,分享个今天写的图片批处理脚本(增加新脚本)

#1

帖子 gzbao9999 » 2010-07-04 17:17

脚本1-
用途:
在图片所在的目录下,
运行此脚本,
自动把符合后缀格式的图片处理为最长边为800(另一边原比例缩放)的某种图片格式(这儿是.jpg)
图片自动生成到当前目录下的target目录下
-------------------------------------------------------------------------
#!/bin/bash
mkdir target
#下面这行用来添加需要处理的图片格式
ls *.jpg *.png *.bmp|while read i;
do
#下面这行用来生成新的文件名,这儿是都转为.jpg格式,可以自己修改(目前只发现某些png转bmp会转成空白图片)
newname=`echo $i|sed 's/\.[^\.]\{1,\}$/.jpg/'`;
#echo $i
#echo $newname;
#下面这样用来处理转换图片 执行此命令需要安装(imagemagic)
convert -scale 800x800 $i ./target/$newname
done
-------------------------------------------------------------------------



改进版1:
用途:
在图片所在的目录下,运行此脚本,
自动把符合后缀格式的图片处理为最长边为800(另一边原比例缩放)的某种图片格式(这儿是.jpg)(对于最长边小于800的图片,只进行格式处理,不进行缩放)
图片自动生成到当前目录下的target目录下
--------------------------------------------------------------------------
#!/bin/bash
mkdir target
for i in *.{jpg,png,bmp}
do
newname=${i%.*}.jpg
convert $i -scale 800x800\> ./target/$newname
done
--------------------------------------------------------------------------

脚本2-
添加英文文字水印脚本
用法:
将此脚本丢在/usr/local/bin下
cd到某个有图片的目录下(假设此目录下有个图叫aaa.jpg)
执行: addmark aaa.jpg http://www.meiyou.com (http://www.meiyou.com 这个随便换,只是中文会成?)
结果:目录下新增一个名为aaa_mark.jpg的图片,该图片左下角打了文字水印www.meiyou.com

addmark
--------------------------------------------------------------------------
#!/bin/bash
convert -background none -fill white -font Bookman-DemiItalic -pointsize 24 label:$2 temptemptemp.png
#north在上且居中
#center在中且居中
#south在下且居中
#west用来修饰在左边 east用来修饰在右边 修饰词在前在后都可以
#组合使用 southwest 在左下角 southeast在右下角
newname=${1%.*}_mark.jpg
composite -compose over -gravity southwest temptemptemp.png $1 $newname
rm temptemptemp.png
--------------------------------------------------------------------------
上次由 gzbao9999 在 2010-07-09 8:33,总共编辑 4 次。
气血鼓荡,身体发胀,偶飘上头,三时舒畅
delectate
帖子: 18311
注册时间: 2008-01-09 22:41

Re: 无聊啦,分享个今天写的图片批处理脚本

#2

帖子 delectate » 2010-07-04 17:29

哦,convert阿
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 无聊啦,分享个今天写的图片批处理脚本

#3

帖子 aerofox » 2010-07-05 23:21

代码: 全选

newname=`echo $i|sed 's/\.[^\.]\{1,\}$/.jpg/'`
不如:

代码: 全选

newname="${i%.*}.jpg"
既简练又更有效率。

代码: 全选

ls *.jpg *.png *.bmp|while read i; 
宜改为

代码: 全选

for i in *.{jpg,png,bmp};
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34

Re: 无聊啦,分享个今天写的图片批处理脚本

#4

帖子 gzbao9999 » 2010-07-06 15:26

谢谢楼上指点:

代码: 全选

newname="${i%.*}.jpg"
这种方式很赞

代码: 全选

for i in *.{jpg,png,bmp};
这种循环方式在文件名中有空格时会出现问题

代码: 全选

ls *.jpg *.png *.bmp|while read i;
这种方式可以避免这种情况
气血鼓荡,身体发胀,偶飘上头,三时舒畅
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 无聊啦,分享个今天写的图片批处理脚本

#5

帖子 eexpress » 2010-07-06 15:31

避免空格的。最好用 ls -1 xxxx|while read i; do
整行读入
● 鸣学
头像
lgxwqq
帖子: 1145
注册时间: 2009-12-04 13:29

Re: 无聊啦,分享个今天写的图片批处理脚本

#6

帖子 lgxwqq » 2010-07-06 15:50

都大牛 :em11
关注和奉献Tianjin Linux User Group的建设,热心参与开源社区,Linux爱好者,python初学者,希望成为一名geek,求交流求指导

我知道发QQ群是不对的。。。可是:Linux天津qq群104029520 73809331,终有一天会没有QQ的。。

Blog:http://www.freetstar.com //欢迎
twitter:https://twitter.com/freetstar
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 无聊啦,分享个今天写的图片批处理脚本

#7

帖子 aerofox » 2010-07-07 6:10

eexpress 写了:避免空格的。最好用 ls -1 xxxx|while read i; do
整行读入
ls 命令中的 -1 在这里是无害的多余物,因为输出到管道就自然隐含了这个选项。
gzbao9999 写了:

代码: 全选

for i in *.{jpg,png,bmp};
这种循环方式在文件名中有空格时会出现问题

代码: 全选

ls *.jpg *.png *.bmp|while read i;
这种方式可以避免这种情况
恰恰相反,用 for i in * 这样的格式更能很好的处理带特殊字符的文件,因为这种方式 bash 直接把文件名当然参数交给了最终的程序,中间没经过二道贩子,而用 ls 加管道的方式多经过 ls 这个二道贩子,容易走样。下面的例子本不需要用循环,只是为了对比这两者的差别。以 “bash:/tmp/test$ ”开头的是命令,紧接着的是结果。

代码: 全选

bash:/tmp/test$ touch 'filename with space' $'filename with\nnewline'
bash:/tmp/test$ for f in filename*; do file "$f"; done
filename with
newline: empty
filename with space: empty
bash:/tmp/test$ ls filename* | while read f; do file "$f"; done
filename with: ERROR: cannot open `filename with' (No such file or directory)
newline: ERROR: cannot open `newline' (No such file or directory)
filename with space: empty
bash:/tmp/test$ 
gzbao9999
帖子: 627
注册时间: 2008-11-08 18:34

Re: 无聊啦,分享个今天写的图片批处理脚本

#8

帖子 gzbao9999 » 2010-07-07 15:06

仔细看了下

这个问题的key应该在于
for i in *
for i in `ls -1`
in之后的来源不同会导致不同的结果(就像楼上说的过了ls这个二道贩子)

在直接处理目录下文件时用for i in *确实效果很好

但在处理文本文件时,由于来源的变化,效果又是另一番样子,
cat aa|while read i;do echo $i;done :这个的效果和cat aa是一样的,一行还在一行
for i in `cat aa`;do echo $i;done :这个的效果 则把原一行的字符之间的连续空格当成换行处理

又学习了个命令 file * :em11
气血鼓荡,身体发胀,偶飘上头,三时舒畅
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 无聊啦,分享个今天写的图片批处理脚本

#9

帖子 aerofox » 2010-07-07 18:31

代码: 全选

for i in `cat aa`;do echo $i;done
`cat aa` 和 * 不是一个概念
不过如果一定要偏爱 for i in `cat aa` 这种用法也不是不可以,先设置 IFS=$'\n' 就可以了,但我认为如此不如用 while。
nigo
帖子: 104
注册时间: 2010-01-23 23:24

Re: 无聊啦,分享个今天写的图片批处理脚本(增加新脚本)

#10

帖子 nigo » 2010-12-26 16:10

MARK下,学习了!
头像
fox0001
帖子: 43
注册时间: 2010-10-08 23:22

Re: 无聊啦,分享个今天写的图片批处理脚本(增加新脚本)

#11

帖子 fox0001 » 2011-09-24 13:34

好帖,正好有用~
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

Re: 无聊啦,分享个今天写的图片批处理脚本(增加新脚本)

#12

帖子 naturalaw » 2011-09-24 14:34

谢谢楼上指点:
代码:
newname="${i%.*}.jpg"

这种方式很赞
高手过招就是不一样.
  • The eternal law
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 无聊啦,分享个今天写的图片批处理脚本

#13

帖子 tusooa » 2011-10-01 22:38

gzbao9999 写了:谢谢楼上指点:

代码: 全选

newname="${i%.*}.jpg"
这种方式很赞

代码: 全选

for i in *.{jpg,png,bmp};
这种循环方式在文件名中有空格时会出现问题

代码: 全选

ls *.jpg *.png *.bmp|while read i;
这种方式可以避免这种情况
错。通配符,会自动处理空格等,而ls的那种方法,要是文件名里有换行,就要挂了。还会新启动个shell,降低效率。

代码: 全选

] ls -ld //
回复