Photoshop Javascript для изменения размера в зависимости от размера файла - PullRequest
1 голос
/ 18 декабря 2011

У меня есть папка с подпапками lot , каждая из которых содержит кучу файлов TIF и PSD внутри. Некоторые из них имеют прозрачность, а некоторые нет. Эти файлы сильно различаются по размеру.

Мне нужно, чтобы все файлы были преобразованы в JPG, или, если они содержат прозрачность, PNG. Мне нужно, чтобы файлы были размером 200 КБ или меньше, и я не против того, насколько они велики, если они не масштабируются.

Кто-то на форуме (за что я безумно благодарен) написал немало кода для него, который мой друг изменил так, чтобы он точно соответствовал тому, что я просил, и мы почти у цели.

Работало нормально, единственная проблема заключалась в том, что много изображений получалось 1x1 пиксель и сплошной цветовой блок.

Мы обнаружили, что это постоянно происходило с одними и теми же изображениями по какой-то причине, но не могли понять, что именно было на этих изображениях.

Теперь Mr forum blokey (http://www.photoshopgurus.com/forum/members/paul-mr.html) изменил скрипт, и теперь он, похоже, работает нормально с PSD.

Он работает с TIF с прозрачностью, но некоторые из TIF с непрозрачностью 100% просто не будут работать. Я не могу найти ничего похожего на эти файлы, кроме синего цвета, хотя это может быть большим совпадением и, вероятно, таковым является (на изображениях, с которыми я имел дело, много синего).

Ниже приведена ссылка на поток, в котором код был впервые написан. Пол М.Р., кажется, считает, что бит с цветовой пробой немного подозрительный, так что, возможно, именно это и вызывает проблемы (синевы?).

http://www.photoshopgurus.com/forum/photoshop-actions-automation/34745-batching-tiffs-jpg-png-w-automatic-resize-based-filesize.html

Хотелось бы сделать немного больше, чтобы попытаться решить это сам, но я едва разбираюсь в этом, я просто знаю, когда может возникнуть ситуация, когда немного скриптов может помочь.

Ниже приведен скрипт в его нынешнем виде:

#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);
    }
}
...