以编程方式将图片上传到 Picasa。






4.83/5 (4投票s)
一种快速有效的方式将整个文件夹上传到Picasa / Google+
引言
随着新的社交网络Google+的推出,人们需要将图片上传到上面。
有一些工具可以将图片从Facebook相册传输到Google,但这并不方便,因为图片上的信息会丢失(Facebook会裁剪exif数据并将图片缩放到非常低的画质,而Google支持最长边为2048px的图片)。因此,最好是重新上传所有图片。
Google+通过一个漂亮的网页界面提供了一种用户友好的方式来完成此操作,但这可能会非常耗时,因为图片被发送到服务器,**然后**由Google进行缩放。正如您所想象的,传输巨大的图像并在服务器上对其进行缩放会消耗大量带宽。
幸运的是,有两个很棒的开源工具,通过一些脚本编写,可以为您自动化整个过程。
ImageMagick和GoogleCL是我们所需的一切。
此外,该脚本还可以选择性地在所有上传的图片上添加水印(别担心,您的原始图片将保持不变)。
背景
该脚本并非旨在成为上传文件到Google+的“最佳方式”,而是作为bash命令和功能的最完整指南。这就是为什么如果您查看脚本代码,您会发现我在脚本的不同部分使用了不同的方法来实现相同的功能。
Using the Code
首先,我们应该准备环境并安装工具(如果您的系统尚未安装)。
在终端窗口中,我们需要
sudo apt-get install imagemagick
sudo apt-get install googlecl
在安装了这两个软件包后,我们需要允许GoogleCL访问我们的Picasa/Google+帐户
google picasa list-albums
程序将要求提供Picasa/Google帐户,并会给出一个链接供您点击
Please specify user: yourpicasaaccount@email.com
Please log in and/or grant access via your browser at
https://www.google.com/accounts/OAuthAuthorizeToken?
oauth_token=lotsofnumbersandletters&hd=default
then hit enter.
在网络上授权后,返回终端并按Enter键。
您将看到您已经上传的所有相册(如果有)。
将文章附带的* .sh脚本下载到*〜/ bin*文件夹中,并使用以下命令赋予其可执行权限
sudo chmod a+x ~/bin/UploadToPicasa.sh
如果您的系统具有本地化文件夹名称,您**确实应该**修改脚本,将“Pictures”替换为您系统中的文件夹名称(例如,在我意大利语的ubuntu 11.10中,该文件夹名为“Immagini”)。
如果您在文章末尾认为自己能够应用此处解释的一些概念,您可以尝试修改脚本,通过使用
sed
从*〜/ .config / user-dirs.dirs*(如果存在)中提取本地化Pictures文件夹。sed -n 's/\(XDG_PICTURES_DIR[:blank:]*=[:blank:]*"\)\(.*\)"/\2/p'
~/.config/user-dirs.dirs
别担心,这真的很简单。您也可以尝试找到另一个执行相同操作的正则表达式。
太棒了!我们已准备就绪。
使用以下命令启动脚本
UploadToPicasa.sh
它将引导您完成整个过程。
让我们分析一下脚本是如何工作的……
首先,脚本需要知道要上传的图片在哪里。默认情况下,它使用当前文件夹。您可以更改它或接受它。如果您输入了错误的路径,它会再次询问。
然后它会询问关于水印的问题。您可以选择位置或“无”,如果您不想为图片添加水印。如果您选择应用水印,脚本会询问水印文件。如果您没有,您可以(在运行脚本**之前**)使用类似以下的命令构建一个简单的仅文本水印
convert -size 600x150 xc:grey30 -font /usr/share/fonts/truetype/ubuntu-font-family/
Ubuntu-BI.ttf -pointsize 40 -gravity center -draw "fill grey70 text 0,0
'Photo by Lino Barreca'" stamp_fgnd.png
convert -size 600x150 xc:black -font /usr/share/fonts/truetype/ubuntu-font-family/
Ubuntu-BI.ttf -pointsize 40 -gravity center -draw "fill white text 1,1
'Photo by Lino Barreca' text 0,0 'Photo by Lino Barreca' fill black text -1,-1
'Photo by Lino Barreca'" +matte stamp_mask.png
composite -compose CopyOpacity stamp_mask.png stamp_fgnd.png stamp.png
最后一个问题是关于在线相册名称。
默认情况下,脚本使用文件夹名称,所以如果您有
~/Pictures/Family/Christmas 2011
提议的名称将是“Christmas 2011”。
如果您将相册名称**留空**,则处理过的图片**将不会被上传**,而是保留在磁盘上。
现在脚本已拥有所有必需的信息。您可以坐下来等待。 :)
如果您选择上传图片,一旦上传完成,它们将被删除。如果您选择不上传,您将在我上面“**警告**”中提到的所需文件夹中找到照片。
关注点
让我们逐行分析脚本使用的所有bash功能……
脚本的第一行是注释(所有以#
开头的行都被视为注释)。注释也可以用在行尾或命令内部。
第3行包含
- 变量声明(
DestFolder
) - 环境变量扩展(
**$**HOME
,它包含用户的主文件夹,通常是/home/username)。$
符号在bash中非常重要,并且有很多用途。 - 带变量串联的
String
声明。
在第4行,您会看到
- 条件求值指令
if
NOT
运算符!
反转比较的结果。- 方括号
[
和]
用于求值。双括号[[
和]]
(此处未显示)是**扩展**测试求值运算符。在[[
和]]
之间不发生文件名扩展或单词分割。 - 文件/文件夹测试运算符
-d
。如果参数是目录,则返回true
。 - 命令延续特殊字符
;
允许在一行中指定多个命令。bash中的if
语法要求then
关键字放在另一行。
第5行
- 创建文件夹的命令
mkdir
。 - 有用的参数
-p
。告诉mkdir
创建整个文件夹树,而不仅仅是最后一个文件夹。如果没有-p
,如果“Pictures”不存在,mkdir
将失败。
第6行
Else
-If
快捷方式elif
。允许您在上述if
条件求值为FALSE
时检查另一个条件。- 带反引号的子shell:
`
和`
中的命令被执行,结果被求值。 - 文件夹内容列表命令
ls
。在unix中最常用的命令之一。它列出所有匹配给定规范的内容。 - 有用的参数
-A
。它用于告诉ls
忽略.
和..
文件夹。这里的逻辑是:告诉我文件夹里的文件是什么,并将结果存储在一个临时变量中(以便用if
进行求值)。 - 检查变量定义/内容。
if [ somevariable ]
如果somevariable
已定义并包含值,则求值为true
。
第7行
- 命令
echo
将内容打印到用户,它接受双引号、单引号和无引号中的string
s(行为相应地改变)。 - 参数
-e
告诉echo
转义字符。它用于在消息中放置一个新行,而不是使用两个echo命令(每个echo默认在末尾放置一个新行)。
第8行:以返回值终止脚本。退出代码0通常表示成功,任何其他值都表示错误。
第9行:if
条件终止:fi
。
第11行:另一个变量赋值,使用PWD
内部变量(它包含实际工作目录)。您也可以使用~+
,它是相同的,并且包含相同的值。
第12行
while
循环。while
在条件求值为TRUE
时执行do done
块中的所有内容。null
命令:
它是一个内置的nop命令,求值为true
,为我们提供了无限循环。do
关键字,通常必须放在新行上,但与;
一起使用可以放在同一行上(如上所述)。
第13行
read
从stdin
读取用户输入。-e
用于读取一行(直到按下Enter键)。-i
用于将某些内容作为默认输入(在此情况下为SourceFolder
的实际值)。-p
用于打印某些内容(问题)。- 用于将读取值存储到的变量(行末指定的
SourceFolder
)。
第14行包含break
语句,用于退出无限循环,以及前面已解释过的命令/关键字。
第18行
select
命令(此处用于要求用户做出选择)。此命令通常在您想创建“菜单”式操作时需要。选择的选项存储在position
中。- 带
$
的子shell($
的另一个用法)。这里的概念与已解释的反引号类似:执行括号内的命令并将结果存储在变量中。 - imagemagick包的复合命令。它返回一个
\n
分隔的可能参数列表。列表由$
存储在临时数组变量中,并由select
用于构建菜单。
第21行:这里使用break
是因为select命令会无限循环。
第24行:String
比较使用!=
运算符(与C相同)。
第33行:使用bash模式匹配从SourceFolder
变量中提取String
。解释它如何工作(并且它不是“初学者级别”)有点长,但您可以自己找到这里和这里。
第36行:-n
选项是检查变量是否包含值的另一种方式(与第6行最后一点相同)。
第38行
- grep命令是另一个常见的unix命令。它用于查找内容。
-q
参数是我们正在搜索的内容。 - 用于googlecl包的list-albums命令的子shell。
- 这里字符串(重定向)
<<<
关键字是称为Here String的高级bash功能。信息在这里。它可以被认为是将变量的内容放入命令的一种方式。
第49行保存内部字段分隔符变量IFS
的内容。这用于在查看数组时确定单词边界。
第50行替换IFS。我们需要更改它,因为SourceFolder
的路径可能包含空格,或者其中的文件可能在其名称中包含空格。
我们需要将路径“/home/user/Pictures/my christmas 2011/Picture 1.JPG”解释为**单个**条目。如果不替换IFS变量,它将被识别为“/home/user/Pictures/my”、“christmas”、“2011/Picture”、“1.JPG”。
第53行包含一个for each
循环。它在in
关键字后取一个变量。变量中包含的每个元素都被赋给each
变量,并在do done
块中使用。
第55行包含let
命令。它用于执行算术运算,并支持C语法。
第68行包含一个管道|
。管道是unix系统中的一项常见任务,它用于将管道**前**面的命令的输出传递给管道**后面**的命令的输入。它有助于将操作串联起来,而无需使用临时文件作为输入/输出。
第75行包含
rm
命令,用于从磁盘删除文件。&&
运算符。它用于“AND”操作。
与条件一起使用时,如果所有条件都为true
,则返回true
。
与命令(如本例)一起使用时,它允许用户说“如果第一个命令成功,**则**执行第二个命令”。如果第一个失败,第二个将被跳过(将未上传的文件保留在磁盘上)。
历史
第一个版本也将是最后一个版本,因为它旨在作为使用工具的示例。将其视为基础,并根据您的需求随意修改。
如果您有任何疑问/提示或需要有关自定义脚本的帮助,请留言。我很乐意为您提供帮助(当我有空闲时间时)。
……别忘了给它评分,谢谢:)