Photoshop Script:像flickr一样的布局图像 [英] Photoshop Script: layout images like flickr

查看:127
本文介绍了Photoshop Script:像flickr一样的布局图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一个脚本,该脚本将打开给定数量的具有不同长宽比的图像,并将它们全部布置在单个文档中,例如flickr画廊.在此页面中看到的内容: http://martin-oehm.de/data/layout.html

有没有可以执行此操作的脚本/插件?这样做的目的只是创建一个包含所有图像的参考文件,而不是在周围浮动多个图像.

谢谢

解决方案

您在10周内没有答案的事实应该告诉您,Photoshop可能不是这样做的最佳/最方便的地方.我编写了以下脚本,使其在Photoshop之外效果很好.

假定您有OSX或Linux来运行bash脚本,并且它使用ImageMagick进行图像处理.

#!/bin/bash
################################################################################
# layout
# Mark Setchell
#
# Layout all images in current directory onto contact sheet. Algorithm is crude
# but fairly effective as follows:
#
# Create temporary workspace
# Resize all images to standard HEIGHT into workspace saving names & new widths
# row=0
# Repeat till there are no images
#   Repeat till row is full
#     Append widest image that will fit to this row
#   End repeat
#   Append this row to output contact sheet
#   row++
# End repeat
################################################################################
WORKSPACE=layout-$$.d
HEIGHT=300
WIDTH=2000
PAD=50

shopt -s nullglob
shopt -s nocaseglob

# Declare our arrays
declare -a names
declare -a width
declare -a indices

################################################################################
# Returns the number of images remaining still to be laid out
################################################################################
NumRemaining(){
   local result=0
   local z
   for ((z=0;z<${#width[@]};z++)) do
      if [ ${width[z]} -gt 0 ]; then
         ((result++))
      fi
   done
   echo $result
}

################################################################################
# Returns index of widest image that fits in specified width
################################################################################
BestFitting(){
   local limit=$1
   local index=-1
   local widest=0
   local z
   local t
   for ((z=0;z<${#width[@]};z++)) do
      t=${width[z]}
      if [[ $t -gt 0 && $t -le $limit && $t -gt $widest ]]; then
         widest=$t
         index=$z
      fi
   done
   echo $index
}

mkdir $WORKSPACE 2> /dev/null
n=0
for f in *.jpg *.png *.gif *.psd; do
   # Save name
   names[n]=$f
   # Extract file extension and basic name, because we want to add "[0]" to end of PSD files
   ext="${f##*.}"
   base="${f%.*}"
   echo $ext | tr "[A-Z]" "[a-z]" | grep -q "psd$"
   if [ $? -eq 0 ]; then 
      convert "$f[0]" -resize x${HEIGHT} $WORKSPACE/${n}.jpg
   else
      convert "$f" -resize x${HEIGHT} $WORKSPACE/${n}.jpg
   fi
   # Get width of the resized file and save
   width[n]=$(identify -format "%w" $WORKSPACE/${n}.jpg)
   echo DEBUG: Index: $n is file: $f thumbnailed to width: ${width[n]}
   ((n++))
done
echo DEBUG: All images added
echo 

cd "$WORKSPACE"
row=0
while [ $(NumRemaining) -gt 0 ]; do
   echo DEBUG: Processing row $row, images left $(NumRemaining)
   remaining=$WIDTH    # new row, we have the full width to play with
   cumwidth=0          # cumulative width of images in this row
   i=0                 # clear array of image indices in this row
   while [ $remaining -gt 0 ]; do
      best=$(BestFitting $remaining)
      if [ $best -lt 0 ]; then break; fi
      indices[i]=$best                    # add this image's index to the indices of images in this row
      w=${width[best]}
      ((cumwidth=cumwidth+w))
      ((remaining=WIDTH-cumwidth-i*PAD))  # decrease remaining space on this line
      width[best]=-1                      # effectively remove image from list
      ((i++))
      echo DEBUG: Adding index: $best, width=$w, cumwidth=$cumwidth, remaining=$remaining
   done
   if [ $i -lt 1 ]; then break; fi   # break if no images in this row
   PADWIDTH=$PAD
   if [ $i -gt 1 ]; then ((PADWIDTH=(WIDTH-cumwidth)/(i-1))); fi
echo $(NumRemaining)
echo $i
   if [ $(NumRemaining) -eq 0 ]; then PADWIDTH=$PAD; fi  # don't stretch last row
   echo DEBUG: Padding between images: $PADWIDTH
   ROWFILE="row-${row}.png"
   THIS="${indices[0]}.jpg"
   # Start row with left pad
   convert -size ${PAD}x${HEIGHT}! xc:white $ROWFILE
   for ((z=0;z<$i;z++)); do
      if [ $z -gt 0 ]; then
         # Add pad to right before appending image
         convert $ROWFILE -size ${PADWIDTH}x${HEIGHT}! xc:white +append $ROWFILE
      fi
      THIS="${indices[z]}.jpg"
      convert $ROWFILE $THIS +append $ROWFILE
   done
   # End row with right pad
   convert $ROWFILE -size ${PAD}x${HEIGHT}! xc:white +append $ROWFILE
   ((row++))
   echo DEBUG: End of row
   echo
done

# Having generated all rows, append them all together one below the next
((tmp=WIDTH+2*PAD))
convert -size ${tmp}x${PAD} xc:white result.png
for r in row*.png; do
   convert result.png $r -size ${tmp}x${PAD}! xc:white -append result.png
done
open result.png

根据输入目录中的文件(显然),它会产生如下输出:

在终端窗口中显示调试信息,如下所示:

DEBUG: Index: 0 is file: 1.png thumbnailed to width: 800
DEBUG: Index: 1 is file: 10.png thumbnailed to width: 236
DEBUG: Index: 2 is file: 11.png thumbnailed to width: 236
DEBUG: Index: 3 is file: 12.png thumbnailed to width: 360
DEBUG: Index: 4 is file: 2.png thumbnailed to width: 480
DEBUG: Index: 5 is file: 3.png thumbnailed to width: 240
DEBUG: Index: 6 is file: 4.png thumbnailed to width: 218
DEBUG: Index: 7 is file: 5.png thumbnailed to width: 375
DEBUG: Index: 8 is file: 6.png thumbnailed to width: 1125
DEBUG: Index: 9 is file: 7.png thumbnailed to width: 1226
DEBUG: Index: 10 is file: 8.png thumbnailed to width: 450
DEBUG: Index: 11 is file: 9.png thumbnailed to width: 300
DEBUG: Index: 12 is file: a.png thumbnailed to width: 400
DEBUG: All images added

DEBUG: Processing row 0, images left 13
DEBUG: Adding index: 9, width=1226, cumwidth=1226, remaining=774
DEBUG: Adding index: 4, width=480, cumwidth=1706, remaining=244
DEBUG: Adding index: 5, width=240, cumwidth=1946, remaining=-46
DEBUG: Padding between images: 27
DEBUG: End of row

DEBUG: Processing row 1, images left 10
DEBUG: Adding index: 8, width=1125, cumwidth=1125, remaining=875
DEBUG: Adding index: 0, width=800, cumwidth=1925, remaining=25
DEBUG: Padding between images: 75
DEBUG: End of row

DEBUG: Processing row 2, images left 8
DEBUG: Adding index: 10, width=450, cumwidth=450, remaining=1550
DEBUG: Adding index: 12, width=400, cumwidth=850, remaining=1100
DEBUG: Adding index: 7, width=375, cumwidth=1225, remaining=675
DEBUG: Adding index: 3, width=360, cumwidth=1585, remaining=265
DEBUG: Adding index: 1, width=236, cumwidth=1821, remaining=-21
DEBUG: Padding between images: 44
DEBUG: End of row

DEBUG: Processing row 3, images left 3
DEBUG: Adding index: 11, width=300, cumwidth=300, remaining=1700
DEBUG: Adding index: 2, width=236, cumwidth=536, remaining=1414
DEBUG: Adding index: 6, width=218, cumwidth=754, remaining=1146
DEBUG: Padding between images: 623
DEBUG: End of row

在反射时,可以通过反转奇数行来改善输出,以使每行上的最大图像在左侧一次,在右侧下次一次-这是一个简单的更改,但我不想要使代码过于复杂.基本上,每当您退出行组合循环时,都将反转数组indices[]的顺序.

以下是一些有用的链接:

Google+算法

jQuery中的flickr算法

我认为Photoshop内置的File-> Automate-> Contact Sheet II不足以满足您的需求...

I am looking for a script that would open a given number of images with different aspect ratios and layout them all in a single document like the flickr gallery. Something as seen in this page: http://martin-oehm.de/data/layout.html

Is there any script/plugin out there that can do this? The purpose is just to create a reference file with all the images instead of having several images floating around.

Thank you

解决方案

The fact that you have had no answers in 10 weeks should tell you that Photoshop is maybe not the best/easiest place to do this.... so, I made the following script that does it pretty well outside of Photoshop.

It assumes you have OSX or Linux to run a bash script and it uses ImageMagick to actually do the image processing.

#!/bin/bash
################################################################################
# layout
# Mark Setchell
#
# Layout all images in current directory onto contact sheet. Algorithm is crude
# but fairly effective as follows:
#
# Create temporary workspace
# Resize all images to standard HEIGHT into workspace saving names & new widths
# row=0
# Repeat till there are no images
#   Repeat till row is full
#     Append widest image that will fit to this row
#   End repeat
#   Append this row to output contact sheet
#   row++
# End repeat
################################################################################
WORKSPACE=layout-$$.d
HEIGHT=300
WIDTH=2000
PAD=50

shopt -s nullglob
shopt -s nocaseglob

# Declare our arrays
declare -a names
declare -a width
declare -a indices

################################################################################
# Returns the number of images remaining still to be laid out
################################################################################
NumRemaining(){
   local result=0
   local z
   for ((z=0;z<${#width[@]};z++)) do
      if [ ${width[z]} -gt 0 ]; then
         ((result++))
      fi
   done
   echo $result
}

################################################################################
# Returns index of widest image that fits in specified width
################################################################################
BestFitting(){
   local limit=$1
   local index=-1
   local widest=0
   local z
   local t
   for ((z=0;z<${#width[@]};z++)) do
      t=${width[z]}
      if [[ $t -gt 0 && $t -le $limit && $t -gt $widest ]]; then
         widest=$t
         index=$z
      fi
   done
   echo $index
}

mkdir $WORKSPACE 2> /dev/null
n=0
for f in *.jpg *.png *.gif *.psd; do
   # Save name
   names[n]=$f
   # Extract file extension and basic name, because we want to add "[0]" to end of PSD files
   ext="${f##*.}"
   base="${f%.*}"
   echo $ext | tr "[A-Z]" "[a-z]" | grep -q "psd$"
   if [ $? -eq 0 ]; then 
      convert "$f[0]" -resize x${HEIGHT} $WORKSPACE/${n}.jpg
   else
      convert "$f" -resize x${HEIGHT} $WORKSPACE/${n}.jpg
   fi
   # Get width of the resized file and save
   width[n]=$(identify -format "%w" $WORKSPACE/${n}.jpg)
   echo DEBUG: Index: $n is file: $f thumbnailed to width: ${width[n]}
   ((n++))
done
echo DEBUG: All images added
echo 

cd "$WORKSPACE"
row=0
while [ $(NumRemaining) -gt 0 ]; do
   echo DEBUG: Processing row $row, images left $(NumRemaining)
   remaining=$WIDTH    # new row, we have the full width to play with
   cumwidth=0          # cumulative width of images in this row
   i=0                 # clear array of image indices in this row
   while [ $remaining -gt 0 ]; do
      best=$(BestFitting $remaining)
      if [ $best -lt 0 ]; then break; fi
      indices[i]=$best                    # add this image's index to the indices of images in this row
      w=${width[best]}
      ((cumwidth=cumwidth+w))
      ((remaining=WIDTH-cumwidth-i*PAD))  # decrease remaining space on this line
      width[best]=-1                      # effectively remove image from list
      ((i++))
      echo DEBUG: Adding index: $best, width=$w, cumwidth=$cumwidth, remaining=$remaining
   done
   if [ $i -lt 1 ]; then break; fi   # break if no images in this row
   PADWIDTH=$PAD
   if [ $i -gt 1 ]; then ((PADWIDTH=(WIDTH-cumwidth)/(i-1))); fi
echo $(NumRemaining)
echo $i
   if [ $(NumRemaining) -eq 0 ]; then PADWIDTH=$PAD; fi  # don't stretch last row
   echo DEBUG: Padding between images: $PADWIDTH
   ROWFILE="row-${row}.png"
   THIS="${indices[0]}.jpg"
   # Start row with left pad
   convert -size ${PAD}x${HEIGHT}! xc:white $ROWFILE
   for ((z=0;z<$i;z++)); do
      if [ $z -gt 0 ]; then
         # Add pad to right before appending image
         convert $ROWFILE -size ${PADWIDTH}x${HEIGHT}! xc:white +append $ROWFILE
      fi
      THIS="${indices[z]}.jpg"
      convert $ROWFILE $THIS +append $ROWFILE
   done
   # End row with right pad
   convert $ROWFILE -size ${PAD}x${HEIGHT}! xc:white +append $ROWFILE
   ((row++))
   echo DEBUG: End of row
   echo
done

# Having generated all rows, append them all together one below the next
((tmp=WIDTH+2*PAD))
convert -size ${tmp}x${PAD} xc:white result.png
for r in row*.png; do
   convert result.png $r -size ${tmp}x${PAD}! xc:white -append result.png
done
open result.png

Depending on the files in your input directory (obviously), it produces output like this:

with debug information in your Terminal window as it goes like this:

DEBUG: Index: 0 is file: 1.png thumbnailed to width: 800
DEBUG: Index: 1 is file: 10.png thumbnailed to width: 236
DEBUG: Index: 2 is file: 11.png thumbnailed to width: 236
DEBUG: Index: 3 is file: 12.png thumbnailed to width: 360
DEBUG: Index: 4 is file: 2.png thumbnailed to width: 480
DEBUG: Index: 5 is file: 3.png thumbnailed to width: 240
DEBUG: Index: 6 is file: 4.png thumbnailed to width: 218
DEBUG: Index: 7 is file: 5.png thumbnailed to width: 375
DEBUG: Index: 8 is file: 6.png thumbnailed to width: 1125
DEBUG: Index: 9 is file: 7.png thumbnailed to width: 1226
DEBUG: Index: 10 is file: 8.png thumbnailed to width: 450
DEBUG: Index: 11 is file: 9.png thumbnailed to width: 300
DEBUG: Index: 12 is file: a.png thumbnailed to width: 400
DEBUG: All images added

DEBUG: Processing row 0, images left 13
DEBUG: Adding index: 9, width=1226, cumwidth=1226, remaining=774
DEBUG: Adding index: 4, width=480, cumwidth=1706, remaining=244
DEBUG: Adding index: 5, width=240, cumwidth=1946, remaining=-46
DEBUG: Padding between images: 27
DEBUG: End of row

DEBUG: Processing row 1, images left 10
DEBUG: Adding index: 8, width=1125, cumwidth=1125, remaining=875
DEBUG: Adding index: 0, width=800, cumwidth=1925, remaining=25
DEBUG: Padding between images: 75
DEBUG: End of row

DEBUG: Processing row 2, images left 8
DEBUG: Adding index: 10, width=450, cumwidth=450, remaining=1550
DEBUG: Adding index: 12, width=400, cumwidth=850, remaining=1100
DEBUG: Adding index: 7, width=375, cumwidth=1225, remaining=675
DEBUG: Adding index: 3, width=360, cumwidth=1585, remaining=265
DEBUG: Adding index: 1, width=236, cumwidth=1821, remaining=-21
DEBUG: Padding between images: 44
DEBUG: End of row

DEBUG: Processing row 3, images left 3
DEBUG: Adding index: 11, width=300, cumwidth=300, remaining=1700
DEBUG: Adding index: 2, width=236, cumwidth=536, remaining=1414
DEBUG: Adding index: 6, width=218, cumwidth=754, remaining=1146
DEBUG: Padding between images: 623
DEBUG: End of row

Upon reflection, the output could maybe be improved by reversing odd-numbered rows so that the largest image on each line is on the left one time and on the right the next time - it is a simple change but I don't want to over-complicate the code. Basically, you would reverse the order of the array indices[] every second time you fall out of the row-assembling loop.

Here are some maybe useful links:

Google+ algorithm

flickr algorithm in jQuery

I presume Photoshop's built-in File->Automate->Contact Sheet II is inadequate for your purposes...

这篇关于Photoshop Script:像flickr一样的布局图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆