基于文件大小调整大小的Photoshop Javascript
我有一个包含很多子文件夹的文件夹,每个子文件夹中都有一堆TIFs和PSD文件。其中一些具有透明度,而另一些则没有。这些文件大小差别很大 我需要将所有文件转换为JPG,或者如果它们包含透明,则为PNG。我要求文件大小为200kb或更小,只要不按比例放大,就不在乎文件有多大 论坛上的某个人(我非常感谢他)为它写了不少代码,我的朋友修改了这些代码以完全符合我的要求,我们现在就快到了 它工作得很好,唯一的问题是很多图像都是1x1像素的,并且是一块实心的颜色块 我们发现,出于某种原因,相同的图像总是会出现这种情况,但无法确定这些图像中到底是什么 现在,forum blokey()先生修改了脚本,它现在似乎可以很好地用于PSD 它可以使用透明度为100%的TIFs,但某些透明度为100%的TIFs无法使用。除了蓝色以外,我找不到其他与这些文件一致的东西,尽管这可能是一个巨大的巧合,而且很可能是(在我处理的图像中有很多蓝色) 下面是一个链接,指向第一次编写代码的线程。保罗先生似乎认为颜色采样器有点可疑,所以也许这就是问题的原因(蓝色?) 我希望我能多做一点尝试,自己解决这个问题,但我对这个东西几乎没有一点了解,我只知道在什么情况下,一点脚本可以帮上忙 以下是当前的脚本:基于文件大小调整大小的Photoshop Javascript,javascript,photoshop,flash-cs5,photoshop-script,Javascript,Photoshop,Flash Cs5,Photoshop Script,我有一个包含很多子文件夹的文件夹,每个子文件夹中都有一堆TIFs和PSD文件。其中一些具有透明度,而另一些则没有。这些文件大小差别很大 我需要将所有文件转换为JPG,或者如果它们包含透明,则为PNG。我要求文件大小为200kb或更小,只要不按比例放大,就不在乎文件有多大 论坛上的某个人(我非常感谢他)为它写了不少代码,我的朋友修改了这些代码以完全符合我的要求,我们现在就快到了 它工作得很好,唯一的问题是很多图像都是1x1像素的,并且是一块实心的颜色块 我们发现,出于某种原因,相同的图像总是会出现
#target PhotoshopString.prototype.endsWith = function(str) {
return (this.match(str + "$") == str)
} String.prototype.startsWith = function(str) {
return this.indexOf(str) == 0;
};
var desiredFileSize = 200000;
app.bringToFront();
app.displayDialogs = DialogModes.NO;
main();
//app.displayDialogs = DialogModes.YES;
function main() {
var topLevelFolder = Folder.selectDialog("Please select top level folder.");
if (topLevelFolder == null)return;
var FileList = [];
getFileList(topLevelFolder);
var startRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
for (var f in FileList) {
app.open(FileList[f]);
activeDocument.changeMode(ChangeMode.RGB);
try {
activeDocument.mergeVisibleLayers();
} catch(e) {} var Name = decodeURI(app.activeDocument.name).replace(/.[^.] + $ /, '');
if (hasTransparency(FileList[f])) {
var saveFile = File(FileList[f].path + "/" + Name + ".png");
SavePNG(saveFile);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
} else {
var saveFile = File(FileList[f].path + "/" + Name + ".jpg");
SaveForWeb(saveFile, 80);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
} app.preferences.rulerUnits = startRulerUnits;
} function getFileList(folder) {
var fileList = folder.getFiles();
for (var i = 0; i < fileList.length; i++) {
var file = fileList[i];
if (file instanceof Folder) {
getFileList(file);
} else {
if ((file.name.endsWith("tiff") || file.name.endsWith("tif") || file.name.endsWith("psd")) && ! file.name.startsWith("._"))FileList.push(file);
}
}
} alert(FileList.length + " files have been modified.");
} function hasTransparency(file) {
if (file.name.endsWith("tiff") || file.name.endsWith("tif")) {
var sample = app.activeDocument.colorSamplers.add([new UnitValue(1.5, 'px'), new UnitValue(1.5, 'px')]);
try {
sample.color.rgb.hexValue;
sample.remove();
return false;
} catch(e) {
sample.remove();
return true;
}
} var doc = activeDocument;
if (doc.activeLayer.isBackgroundLayer)return false;
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putProperty(charIDToTypeID("Chnl"), charIDToTypeID("fsel"));
desc.putReference(charIDToTypeID("null"), ref);
var ref1 = new ActionReference();
ref1.putEnumerated(charIDToTypeID("Chnl"), charIDToTypeID("Chnl"), charIDToTypeID("Trsp"));
desc.putReference(charIDToTypeID("T "), ref1);
executeAction(charIDToTypeID("setd"), desc, DialogModes.NO);
var w = doc.width.as('px');
var h = doc.height.as('px');
var transChannel = doc.channels.add();
doc.selection.store(transChannel);
if (transChannel.histogram[255] != (h * w)) {
transChannel.remove();
return true;
} else {
transChannel.remove();
return false;
}
};
function SavePNG(saveFile) {
pngSaveOptions = new PNGSaveOptions();
activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE);
var actualFilesize = saveFile.length;
var ratio = desiredFileSize / actualFilesize;
if (ratio < 1) {
var imageScale = Math.sqrt(ratio);
activeDocument.resizeImage(activeDocument.width * imageScale, activeDocument.height * imageScale, activeDocument.resolution, ResampleMethod.BICUBICSMOOTHER);
activeDocument.saveAs(saveFile, pngSaveOptions, true, Extension.LOWERCASE);
}
}
function SaveForWeb(saveFile, jpegQuality) {
var sfwOptions = new ExportOptionsSaveForWeb();
sfwOptions.format = SaveDocumentType.JPEG;
sfwOptions.includeProfile = false;
sfwOptions.interlaced = 0;
sfwOptions.optimized = true;
sfwOptions.quality = jpegQuality;
activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, sfwOptions);
var actualFilesize = saveFile.length;
var ratio = desiredFileSize / actualFilesize;
if (ratio < 1) {
var imageScale = Math.sqrt(ratio);
activeDocument.resizeImage(activeDocument.width * imageScale, activeDocument.height * imageScale, activeDocument.resolution, ResampleMethod.BICUBICSMOOTHER);
activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, sfwOptions);
}
}
#目标PhotoshopString.prototype.endsWith=函数(str){
return(this.match(str+“$”)==str)
}String.prototype.startsWith=函数(str){
返回这个。indexOf(str)==0;
};
var desiredFileSize=200000;
app.bringToFront();
app.displayDialogs=DialogModes.NO;
main();
//app.displayDialogs=DialogModes.YES;
函数main(){
var topLevelFolder=Folder.selectDialog(“请选择顶级文件夹”);
如果(topLevelFolder==null)返回;
var FileList=[];
getFileList(topLevelFolder);
var startRulerUnits=app.preferences.rulerUnits;
app.preferences.rulerUnits=单位.PIXELS;
for(文件列表中的变量f){
应用程序打开(文件列表[f]);
changeMode(changeMode.RGB);
试一试{
activeDocument.mergeVisibleLayers();
}catch(e){}var Name=decodeURI(app.activeDocument.Name).replace(/.[^.]+$/,'');
if(透明(文件列表[f])){
var saveFile=File(文件列表[f].path+“/”+Name+.png”);
SavePNG(saveFile);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}否则{
var saveFile=File(文件列表[f].path+“/”+Name+.jpg”);
SaveForWeb(saveFile,80);
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
}app.preferences.rulerUnits=startRulerUnits;
}函数getFileList(文件夹){
var fileList=folder.getFiles();
对于(var i=0;i