我需要做以下事情。在具有命名约定的文件夹中有多个png文件: 1.png 1_m.png,2.png 2_m.png(依此类推)。 png文件具有相同的宽度和高度(320 x 360像素)。
现在脚本应该执行以下操作:
获取文件1.png 1_m.png并创建一个新文件,其中1_m.png位于左侧,而1.png位于右侧,将这两个合并在一个图层上并保存为1_done.png , 对文件夹中的所有文件运行此操作。
这不一定是我在网上搜索的Photoshop脚本,但找不到任何有用的解决方案。此处也没有任何内容,文件可能位于不同的文件夹中,这是最简单的解决方案。 我的Photoshop版本是CS5
答案 0 :(得分:3)
此脚本将执行您想要的操作。将所有文件放在目录中,然后使用自动批处理运行脚本 - >脚本。它会在文件名中找到没有和下划线的图像,然后打开它的配对名称文件(带有“_m”),将它们并排放置并将_done添加到文件名中保存。
// pref像素 app.preferences.rulerUnits = Units.PIXELS;
var srcDoc = app.activeDocument;
// call the current document
var srcDoc = app.activeDocument;
// set original width and height
var imageW = srcDoc.width.value;
var imageH = srcDoc.height.value;
// get the info out of the source doc
var fileName = srcDoc.name;
var docName = fileName.substring(0,fileName.length -4);
var filePath = srcDoc.path.toString();
var fileExt = fileName.substring(fileName.length -4, fileName.length);
var nameCheck = fileName.substring(0,fileName.indexOf("_"));
if (nameCheck <1)
{
// no underscore so we need to open it's namesake
// alert(nameCheck)
var filePair = filePath + "/" + docName + "_m" + fileExt;
openThisFile(filePair)
activeDocument.selection.selectAll()
activeDocument.selection.copy();
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument = srcDoc;
activeDocument.resizeCanvas(imageW *2, imageH, AnchorPosition.MIDDLELEFT);
selectRect(0, imageW, imageW*2, imageH)
activeDocument.paste()
activeDocument.flatten();
var newName = filePath + "/" + docName + "_done" + fileExt
saveMe(newName)
}
else
{
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}
function openThisFile(masterFileNameAndPath)
{
var fileRef = new File(masterFileNameAndPath)
if (fileRef.exists)
//open that doc
{
app.open(fileRef);
}
else
{
alert("error opening " + masterFileNameAndPath)
}
}
function selectRect(top, left, right, bottom)
{
srcDoc.selection.deselect()
// =======================================================
var id1 = charIDToTypeID( "setd" );
var desc1 = new ActionDescriptor();
var id2 = charIDToTypeID( "null" );
var ref1 = new ActionReference();
var id3 = charIDToTypeID( "Chnl" );
var id4 = charIDToTypeID( "fsel" );
ref1.putProperty( id3, id4 );
desc1.putReference( id2, ref1 );
var id5 = charIDToTypeID( "T " );
var desc2 = new ActionDescriptor();
var id6 = charIDToTypeID( "Top " );
var id7 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id6, id7, top );
var id8 = charIDToTypeID( "Left" );
var id9 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id8, id9, left );
var id10 = charIDToTypeID( "Btom" );
var id11 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id10, id11, bottom );
var id12 = charIDToTypeID( "Rght" );
var id13 = charIDToTypeID( "#Pxl" );
desc2.putUnitDouble( id12, id13, right );
var id16 = charIDToTypeID( "Rctn" );
desc1.putObject( id5, id16, desc2 );
executeAction( id1, desc1, DialogModes.NO );
}
function saveMe(fPath)
{
// save out the image
var pngFile = new File(fPath);
pngSaveOptions = new PNGSaveOptions();
pngSaveOptions.embedColorProfile = true;
pngSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
pngSaveOptions.matte = MatteType.NONE; pngSaveOptions.quality = 1;
activeDocument.saveAs(pngFile, pngSaveOptions, false, Extension.LOWERCASE);
// close that saved png
app.activeDocument.close()
}
答案 1 :(得分:2)
我会使用适用于Windows,OSX和Linux的ImageMagick来实现这一点 - 事实上它无论如何都安装在大多数Linux发行版上。
它的关键是使用ImageMagick的convert
命令并排添加两个图像,基本上是这样的:
convert left.png right.png +append out.png
所以脚本看起来像这样 - (差不多有一半是评论):
#!/bin/bash
for i in [0-9]*_m.png; do
# Deduce name of left image
left="$i"
# Deduce name of right image
right="${i/_m/}"
# Deduce name of output image
done="${i/_m/_done}"
# Merge the little devils
convert "$left" "$right" +append "$done"
done
如果我们从这样的图像开始:
和
它将为所有对生成此内容: