65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (4投票s)

2011年11月11日

CDDL

9分钟阅读

viewsIcon

22075

downloadIcon

401

一种快速有效的方式将整个文件夹上传到Picasa / Google+

引言

随着新的社交网络Google+的推出,人们需要将图片上传到上面。
有一些工具可以将图片从Facebook相册传输到Google,但这并不方便,因为图片上的信息会丢失(Facebook会裁剪exif数据并将图片缩放到非常低的画质,而Google支持最长边为2048px的图片)。因此,最好是重新上传所有图片。

Google+通过一个漂亮的网页界面提供了一种用户友好的方式来完成此操作,但这可能会非常耗时,因为图片被发送到服务器,**然后**由Google进行缩放。正如您所想象的,传输巨大的图像并在服务器上对其进行缩放会消耗大量带宽。

幸运的是,有两个很棒的开源工具,通过一些脚本编写,可以为您自动化整个过程。
ImageMagickGoogleCL是我们所需的一切。
此外,该脚本还可以选择性地在所有上传的图片上添加水印(别担心,您的原始图片将保持不变)。

背景

该脚本并非旨在成为上传文件到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 / Watermarked*文件夹(在脚本中硬编码)来存储文件,然后再上传它们(并在此处保留因错误或您指示脚本不上传而未上传的文件)。
如果您的系统具有本地化文件夹名称,您**确实应该**修改脚本,将“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将内容打印到用户,它接受双引号、单引号和无引号中的strings(行为相应地改变)。
  • 参数-e告诉echo转义字符。它用于在消息中放置一个新行,而不是使用两个echo命令(每个echo默认在末尾放置一个新行)。

第8行:以返回值终止脚本。退出代码0通常表示成功,任何其他值都表示错误。

第9行:if条件终止:fi

第11行:另一个变量赋值,使用PWD内部变量(它包含实际工作目录)。您也可以使用~+,它是相同的,并且包含相同的值。

第12行

  • while循环。while在条件求值为TRUE时执行do done块中的所有内容。
  • null命令:它是一个内置的nop命令,求值为true,为我们提供了无限循环。
  • do关键字,通常必须放在新行上,但与;一起使用可以放在同一行上(如上所述)。

第13行

  • readstdin读取用户输入。
  • -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
    与命令(如本例)一起使用时,它允许用户说“如果第一个命令成功,**则**执行第二个命令”。如果第一个失败,第二个将被跳过(将未上传的文件保留在磁盘上)。

历史

第一个版本也将是最后一个版本,因为它旨在作为使用工具的示例。将其视为基础,并根据您的需求随意修改。

如果您有任何疑问/提示或需要有关自定义脚本的帮助,请留言。我很乐意为您提供帮助(当我有空闲时间时)。

……别忘了给它评分,谢谢:)

© . All rights reserved.