使用shell和&amp ;;递归图像大小调整大小ImageMagick的

时间:2015-08-13 00:52:12

标签: php mysql bash shell

我将图像从其他脚本导入到我的脚本中 两个图像名称都保存在数据库中。

我的剧本

Post_ID  -   old_pic_name           -   new_pic_name    -   is_gif
1        -   long_file_name.jpg     -   1.jpg           -     0
2        -   long_file_name2.png    -   2.png           -     0
3        -   long_file_name3.gif    -   3.gif           -     1

我有专门的服务器。 我尝试使用php从数据库中导入文件名中的旧名称然后调整大小并重命名。它很成功,但有一个小问题。

原始网站包含超过116000张图片。 PHP转换需要大约15分钟来转换500张照片,有时会以错误结束,我不得不手动重新启动刷新。

我不知道我是否可以为脚本提供所有服务器资源以更快地完成加载,或者还有别的东西。

我想用SHELL做。可能会更快,它将覆盖php max_execution_time和memory_limit限制。

原始照片位于/ old_data /文件夹中。 新文件夹应该是这样的: / o /包含以new_post_id.image_extension为名称的文件的原始副本 / t /包含3个已调整大小的(728px宽度)名称l-new_post_id.image_extension和(500px宽度)new_post_id.image_extension和s-new_post_id.image_extension(300px宽度)。

例如:
第一行:
ID = 1
老照片目录:/old_data/long_file_name.jpg
新照片目录:/o/1.jpg(原文的精确副本,刚重命名)
新调整大小的照片:/t/1.jpg(500px max-width)& /t/l-1.jpg(728px max-width)& /t/s-1.jpg(300px max-width)

我在想是否可以将这些信息导出为合适的文件格式,可以使用linux中的bash shell导入,并使用数据进行重命名并使用GD和ImageMagick递归调整大小。但老实说,我不知道该怎么做。

我希望有人可以提供帮助。

最诚挚的问候。

2 个答案:

答案 0 :(得分:0)

好的,我已经尝试过编辑你的东西,但我仍然无法理解。

我对编程的了解是:你必须能够以最简单的方式拼写你正在做的事情。 然后你就可以开始编码了。

所以,我说,小心思开始吧。 把你的工作分成几部分。 思考迭代和增量。

此外,如果您需要来自stackoverflow的帮助,请考虑格式化您的问题,以便人们可以真正理解它。

这可能是一个评论,但实际上,它是一个答案。

答案 1 :(得分:0)

问题不是那么清楚,但无论如何我会尝试给出一个可能有帮助的答案。

正如我从您的问题中所理解的,您有一个PHP脚本,它从服务器中提取了超过100,000个图像,并将它们放在名为old_data/的目录中。然后,您需要一个shell / bash脚本,该脚本将获取此目录中文件中列出的所有图像并调整其大小。结果将存储在三个不同的目录中。

我假设您创建了PHP脚本中列出图像的文件,因此可以自己选择此文件的格式;我建议每行存储一个图像。我会这样存储:

1;long_file_name.jpg
2;some_other_file.png
...

您还可以存储由制表工具或空格或类似物分隔的地方。我不会将目标目录存储在此行中,因为它们对于每个图像都是相同的。

现在你需要的是一个shell脚本,它迭代这个文件的行并调整所有图像的大小,将它们放在三个目标目录中。我会使用convert来调整图像大小。 convert可以像这样使用:

convert old_data/long_file_name.jpg -resize 300 /t/s-1.jpg

现在我们要做的就是将这个命令嵌入到脚本中。

while read line || [[ -n "$line" ]]; do
  num= echo $line | cut -d ';' -f 1
  file= echo $line | cut -d ';' -f 2
  fe= ${file##*.}
  mv old_data/${file} o/${num}.${fe}
  convert old_data/${file} -resize 500 /t/${num}.${fe}
  convert old_data/${file} -resize 728 /t/l-${num}.${fe}
  convert old_data/${file} -resize 300 /t/s-${num}.${fe}
done < $1

要运行此脚本,请使用:

./script image_list

请注意,|| [[ -n "$line" ]]只是为了确保脚本读取文件的最后一行(如果后面没有换行符);如果您的PHP-sript在文件末尾添加换行符,则可以删除此部分 您也可以尝试将图像转换为728像素,然后将其转换为500像素,最后通过读取较小的文件将500px转换为300px以获得可能的加速,但我不确定这一点,您必须尝试它

我实际上不确定你是否必须逃避${file##*.}中的点,就像在我的bash中那样:${file##*.}${file##*\.}

为了加快转换速度,看看here,可能会有一些关于并行化整个事情的有用信息。

我已从cppcoderhereStephenhere获取了一些代码。