Photoshop 批量无损四宫格裁图脚本

背景:有个朋友让我写一个批量四宫格裁切图片的程序,我吹牛答应了,写了一个程序实现了。但是发现裁切后的图片失真,大小也变小,以失败告终。硬着头皮尝试Adobe PhotoshopScripting来实现。

优点:保持原图的分辨率和CMYK颜色模式、TIF格式,真正的无损批量裁切

Photoshop 批量无损四宫格裁图脚本


Photoshop 批量无损四宫格裁图脚本

1、电脑D盘创建文件夹“'D:\\\\tupian' ”,把要处理的图片拷贝到这个文件夹下

2、电脑D盘创建文件夹“'D:\\\\tupian_new'”,运行脚本后的图片会保证在这个文件夹下

3、复制分割线一下代码,记事本保存,然后修改扩展名为“.jsx”

4、打开Photoshop,把脚本拖入ps即可自动批量处理

参考:http://coolketang.com/tutorials/menu5lesson1.php

https://www.adobe.com/devnet/photoshop/scripting.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#target photoshop

var INPUT_PATH = 'D:\\\\tupian' //输入路径

var OUTPUT_PATH = 'D:\\\\tupian_new'//输出路径

var LIMIT_SIZE = 1024 // 最大边长

var SAVE_FORMAT = 'tif'// 保存格式 jpg, png, webjpg, webpng,tif

var SAVE_QUALITY = 60 // 图片质量[0, 100]

var TEST_MODE = false // 画质测试模式

function Main(){

if(TEST_MODE==true)

{

TestMode();

alert("脚本执行完毕");

return;

}

fileOut = new File(OUTPUT_PATH + "\\\\PhotoShop.log");

fileOut.open("w", "TEXT", "????");

fileOut.write("开始批处理\\n");

var input_folder = new Folder(INPUT_PATH);

if(input_folder!=null)

{

var files = input_folder.getFiles ("*.*");

var i=0;

while(files[i]!=null ){

var fp = app.open(new File(files[i]));

fileOut.write(fp.name +"\\n");

if(fp !=null){

try{

//Resize(LIMIT_SIZE);

Crop();

var filename = fp.name.substring(0,fp.name.lastIndexOf("."))+"_1";

Save(OUTPUT_PATH, filename, SAVE_FORMAT, SAVE_QUALITY);

app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

}catch(e){

//alert (e.name + ": " + e.message);

fileOut.write(e.name + ": " + e.message+"\\n");

}

}

fp = app.open(new File(files[i]));

if(fp !=null){

try{

Crop2();

var filename = fp.name.substring(0,fp.name.lastIndexOf("."))+"_2";

Save(OUTPUT_PATH, filename, SAVE_FORMAT, SAVE_QUALITY);

app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

}catch(e){

//alert (e.name + ": " + e.message);

fileOut.write(e.name + ": " + e.message+"\\n");

}

}

fp = app.open(new File(files[i]));

if(fp !=null){

try{

Crop3();

var filename = fp.name.substring(0,fp.name.lastIndexOf("."))+"_3";

Save(OUTPUT_PATH, filename, SAVE_FORMAT, SAVE_QUALITY);

app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

}catch(e){

//alert (e.name + ": " + e.message);

fileOut.write(e.name + ": " + e.message+"\\n");

}

}

fp = app.open(new File(files[i]));

if(fp !=null){

try{

Crop4();

var filename = fp.name.substring(0,fp.name.lastIndexOf("."))+"_4";

Save(OUTPUT_PATH, filename, SAVE_FORMAT, SAVE_QUALITY);

app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

}catch(e){

//alert (e.name + ": " + e.message);

fileOut.write(e.name + ": " + e.message+"\\n");

}

}

i++;

}

alert("脚本执行完毕");

}

fileOut.write("批处理结束\\n");

}

function Resize(LimitSize){

var w = app.activeDocument.width.value;

var h = app.activeDocument.height.value;

if(w> LimitSize || h >LimitSize){

if(w>h){

var per=LimitSize/w*100;

app.activeDocument.resizeImage(per+"%",per+"%", null, ResampleMethod.BICUBICSHARPER);

}

else{

var per=LimitSize/h*100;

app.activeDocument.resizeImage(per+"%",per+"%", null, ResampleMethod.BICUBICSHARPER);

}

}

}

function Crop(){

var w=app.activeDocument.width;

var h=app.activeDocument.height;

var ww=w/2;

var hh=h/2;

//定义一个变量[bounds],用来表示文档需要裁切的区域,即裁切从坐标[0,0]至[140,104]的区域。

//注意Photoshop坐标原点在左上角。

var bounds = [0, 0, ww, hh];

//定义一个变量[angle],用来设置裁切的旋转角度为0。

var angle = 0;

//调用[document]对象的[crop]方法,来裁切当前文档。

app.activeDocument.crop(bounds, angle);

}

function Crop2(){

var w=app.activeDocument.width;

var h=app.activeDocument.height;

var ww=w/2;

var hh=h/2;

//定义一个变量[bounds],用来表示文档需要裁切的区域,即裁切从坐标[0,0]至[140,104]的区域。

//注意Photoshop坐标原点在左上角。

var bounds = [ww, 0, w, hh];

//定义一个变量[angle],用来设置裁切的旋转角度为0。

var angle = 0;

//调用[document]对象的[crop]方法,来裁切当前文档。

app.activeDocument.crop(bounds, angle);

}

function Crop3(){

var w=app.activeDocument.width;

var h=app.activeDocument.height;

var ww=w/2;

var hh=h/2;

//定义一个变量[bounds],用来表示文档需要裁切的区域,即裁切从坐标[0,0]至[140,104]的区域。

//注意Photoshop坐标原点在左上角。

var bounds = [ 0, hh, ww, h];

//定义一个变量[angle],用来设置裁切的旋转角度为0。

var angle = 0;

//调用[document]对象的[crop]方法,来裁切当前文档。

app.activeDocument.crop(bounds, angle);

}

function Crop4(){

var w=app.activeDocument.width;

var h=app.activeDocument.height;

var ww=w/2;

var hh=h/2;

//定义一个变量[bounds],用来表示文档需要裁切的区域,即裁切从坐标[0,0]至[140,104]的区域。

//注意Photoshop坐标原点在左上角。

var bounds = [ ww, hh, w, h];

//定义一个变量[angle],用来设置裁切的旋转角度为0。

var angle = 0;

//调用[document]对象的[crop]方法,来裁切当前文档。

app.activeDocument.crop(bounds, angle);

}

function TestMode(){

var input_folder = new Folder(INPUT_PATH);

if(input_folder!=null)

{

var files = input_folder.getFiles ("*.*");

var fp = app.open(new File(files[0]));

if(fp !=null){

Resize(LIMIT_SIZE);

// jpg test

Save(OUTPUT_PATH, 'jpg_0', 'jpg', 0);

Save(OUTPUT_PATH, 'jpg_30', 'jpg', 30);

Save(OUTPUT_PATH, 'jpg_60', 'jpg', 60);

Save(OUTPUT_PATH, 'jpg_80', 'jpg', 80);

Save(OUTPUT_PATH, 'jpg_100', 'jpg', 100);

// png test

Save(OUTPUT_PATH, 'png_0', 'png', 0);

Save(OUTPUT_PATH, 'png_30', 'png', 30);

Save(OUTPUT_PATH, 'png_60', 'png', 60);

Save(OUTPUT_PATH, 'png_80', 'png', 80);

Save(OUTPUT_PATH, 'png_100', 'png', 100);

// webjpg test

Save(OUTPUT_PATH, 'webjpg_0', 'webjpg', 0);

Save(OUTPUT_PATH, 'webjpg_30', 'webjpg', 30);

Save(OUTPUT_PATH, 'webjpg_60', 'webjpg', 60);

Save(OUTPUT_PATH, 'webjpg_80', 'webjpg', 80);

Save(OUTPUT_PATH, 'webjpg_100', 'webjpg', 100);

// webpng test

Save(OUTPUT_PATH, 'webpng_0', 'webpng', 0);

Save(OUTPUT_PATH, 'webpng_30', 'webpng', 30);

Save(OUTPUT_PATH, 'webpng_60', 'webpng', 60);

Save(OUTPUT_PATH, 'webpng_80', 'webpng', 80);

Save(OUTPUT_PATH, 'webpng_100', 'webpng', 100);

app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

}

}

}

//format: jpg, png, webjpg, webpng

//quality: [0, 100]

function Save(savePath, filename, format, quality){

saveFile = OUTPUT_PATH+"\\\"+filename

if(format == 'jpg'){

saveFile += '.jpg'

q = Math.round(quality / 100 * 12)

SaveJPEG(saveFile, q)

}else if(format == 'png'){

saveFile += '.png'

q = Math.round((100-quality) / 100 * 9)

SavePNG(saveFile, q)

}else if(format == 'tif'){

saveFile += '.tif'

q =12

SaveTIFF(saveFile, q)

}else if(format == 'webjpg'){

saveFile += '.jpg'

SaveForWeb(saveFile, SaveDocumentType.JPEG, quality)

}else if(format == 'webpng'){

saveFile += '.png'

SaveForWeb(saveFile, SaveDocumentType.PNG-24, quality)

}else{

saveFile += '.jpg'

SaveForWeb(saveFile, SaveDocumentType.JPEG, quality)

}

}

function SaveJPEG(saveFile, quality){

jpgSaveOptions = new JPEGSaveOptions();

// embedColorProfile (True to embed the color profile in the document.)

jpgSaveOptions.embedColorProfile = true;

// formatOptions (The download format to use.)

// Default: FormatOptions.STANDARDBASELINE

// Range: FormatOptions.STANDARDBASELINE,

// FormatOptions.OPTIMIZEDBASELINE,

// FormatOptions.PROGRESSIVE

jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;

// matte (The color to use to fill anti-aliased edges adjacent to transparent areas of the image.

// When transparency is turned off for an image, the matte color is applied to transparent areas.)

// Default: MatteType.WHITE

// Range: MatteType.BACKGROUND

// MatteType.BLACK

// MatteType.FOREGROUND

// MatteType.NETSCAPE

// MatteType.NONE

// MatteType.SEMIGRAY

// MatteType.WHITE

jpgSaveOptions.matte = MatteType.NONE;

// quality (The image quality setting to use; affects file size and compression)

// Default: 3

// Range: [0,12]

jpgSaveOptions.quality = quality;

// scans (The number of scans to make to incrementally display the image on the page.

// Valid only for when formatOptions = FormatOptions.PROGRESSIVE.)

// Default: 3

// Range: [3,5]

//jpgSaveOptions.scans = 3

// typename (The class name of the referenced JPEGSaveOptions object.)

// Read only

//jpgSaveOptions.typename

activeDocument.saveAs(new File(saveFile), jpgSaveOptions, true,Extension.LOWERCASE);

}

function SavePNG(saveFile, compression){

pngSaveOptions = new PNGSaveOptions();

// compression (The compression value)

// Default: 0

// Range: [0,9]

pngSaveOptions.compression = compression

// interlaced (True to interlace rows)

// Default: false

pngSaveOptions.interlaced = false

// typename (The class name of the referenced PNGSaveOptions object.)

// Read only

//pngSaveOptions.typename

activeDocument.saveAs(new File(saveFile), pngSaveOptions, true,Extension.LOWERCASE);

}

function SaveForWeb(saveFile, format, quality){

var webSaveOptions = new ExportOptionsSaveForWeb();

// blur (Applies blur to the image to reduce artifacts)

// Default: 0.0

webSaveOptions.blur = 0.0;

// colorReduction (The color reduction algorithm.)

// Default: ColorReductionType.SELECTIVE

// Range: ColorReductionType.PERCEPTUAL,

// ColorReductionType.SELECTIVE,

// ColorReductionType.ADAPTIVE,

// ColorReductionType.RESTRICTIVE,

// ColorReductionType.CUSTOM,

// ColorReductionType.BLACKWHITE

// ColorReductionType.GRAYSCALE,

// ColorReductionType.MACINTOSH

// ColorReductionType.WINDOWS

webSaveOptions.colorReduction = ColorReductionType.SELECTIVE

// colors (The number of colors in the palette.)

// Default: 256

webSaveOptions.colors = 256

// dither (The type of dither)

// Default: Dither.DIFFUSION

// Range: Dither.DIFFUSION

// Dither.NOISE

// Dither.NONE

// Dither.PATTERN

webSaveOptions.dither = Dither.DIFFUSION

// ditherAmount (The amount of dither.Valid only when dither = Dither.DIFFUSION)

// Default: 100

webSaveOptions.ditherAmount = 100;

// format (The file format to use)

// Ddefault: SaveDocumentType.COMPUSERVEGIF

// Range: SaveDocumentType.COMPUSERVEGIF,

// SaveDocumentType.JPEG,

// SaveDocumentType.PNG-8,

// SaveDocumentType.PNG-24,

// SaveDocumentType.BMP

webSaveOptions.format = SaveDocumentType.JPEG;

// includeProfile (True to include the document’s embedded color profile)

// Default: false

webSaveOptions.includeProfile = false;

// interlaced (True to download in multiple passes progressive)

// Default: false

webSaveOptions.interlaced = false;

// lossy (The amount of lossiness allowed)

// Default: 0

webSaveOptions.lossy = 0;

// matteColor (The colors to blend transparent pixels against.)

// Type: RGBColor

//webSaveOptions.matteColor ;

// optimized (True to create smaller but less compatible files. Valid only when format = SaveDocumentType.JPEG.)

// Default: true

webSaveOptions.optimized = true;

// PNG8 (Indicates the number of bits; true = 8, false = 24. Valid only when format = SaveDocumentType.PNG.)

// Default: true

webSaveOptions.PNG8 = true;

// quality (The quality of the produced image as a percentage)

// Default: 60

// Range: [0, 100]

webSaveOptions.quality = quality;

// transparency (Indication of transparent areas of the image should be included in the saved image)

// Default: true

webSaveOptions.transparency = true;

// transparencyAmount (The amont of transparency dither. Valid only if transparency = true.)

// Default: 100

webSaveOptions.transparencyAmount = 100;

// transparencyDither (The transparency dither algorithm)

// Default: Dither.NONE

// Range: Dither.DIFFUSION

// Dither.NOISE

// Dither.NONE

// Dither.PATTERN

webSaveOptions.transparencyDither = Dither.NONE

// typename (The class name of the referenced ExportOptionsSaveForWeb object.)

// Read only

//webSaveOptions.typename

// webSnap (The tolerance amount within which to snap close colors to web palette colors)

// Default: 0

webSaveOptions.webSnap = 0;

activeDocument.exportDocument(new File(saveFile), ExportType.SAVEFORWEB, webSaveOptions);

}

function SaveTIFF (savePath, quality){

tiffsaveOptions = new TiffSaveOptions();

tiffsaveOptions.embedColorProfile = true;

tiffsaveOptions.imageCompression = TIFFEncoding.NONE;

activeDocument.saveAs(new File(saveFile), tiffsaveOptions, true,Extension.LOWERCASE);

}

Main();

//alert ("finish");


分享到:


相關文章: