解决PSD文件体积巨大,PS卡顿的方法(包括智能对象)

2023-04-08 135 0

尝试过的方案

方案1

元数据清理工具,例如:Exif Tag Remover,Exiftool 之类的,能清除部分元数据,但无法完全清除PSD中的元数据。

方案2

找到了这个博客的解决方案:一键大幅清理PSD文件容量占用

递归遍历图层对每个智能对象进行处理。

以下代码请复制到文本编辑器中保存为:PsDeepCleaner.jsx,或者下载下方操作步骤中附件。

/**
 * @author Jason
 * @email jiangran@126.com
 * @name PsDeepCleaner
 * @description photoshop metadata deep clean script
 */

function deleteDocumentAncestorsMetadata() {
    if(String(app.name).search("Photoshop") > 0) {

        if(!documents.length) {
            alert("您没有打开文件。请打开一个文件再执行此脚本。")
            return;
        }

        if (ExternalObject.AdobeXMPScript == undefined) ExternalObject.AdobeXMPScript = new ExternalObject("lib:AdobeXMPScript");

        var xmp = new XMPMeta( activeDocument.xmpMetadata.rawData);
        xmp.deleteProperty(XMPConst.NS_PHOTOSHOP, "DocumentAncestors");
        app.activeDocument.xmpMetadata.rawData = xmp.serialize();

        clearDocumentAncestorsForAllLayers(app.activeDocument);

        if (app.activeDocument !== mainDocument) {
            app.activeDocument.close(SaveOptions.SAVECHANGES);
        }else{
            app.activeDocument.save();
        }
    }
}

function clearDocumentAncestorsForAllLayers(doc) {
    try {

        if (doc == undefined) {
            return;
        }

        for (var i = 0; i < doc.layers.length; i++) {
            var curLayer = doc.layers[i];
            if (curLayer.typename != "ArtLayer") {
                clearDocumentAncestorsForAllLayers(curLayer);
                continue;
            }

            if (curLayer.kind == "LayerKind.SMARTOBJECT") {

                app.activeDocument.activeLayer = curLayer;
                
                var idplacedLayerEditContents = stringIDToTypeID("placedLayerEditContents");
                var actionDescriptor = new ActionDescriptor();
                executeAction(idplacedLayerEditContents, actionDescriptor, DialogModes.NO);

                if(app.activeDocument.activeLayer == curLayer){
                    continue;
                }
                deleteDocumentAncestorsMetadata()
                layerSetStr += ("\n"+curLayer.name)

            }
        }
    } catch (e) {
        alert("图层清理失败,请重启PS后重试。文件名:"+doc+";错误信息:"+e)
    }
}

var layerSetStr = "";
var mainDocument = app.activeDocument;
function start(){
    deleteDocumentAncestorsMetadata();
    alert("清除完毕。\n[文件名]:"+mainDocument.name+"\n[图层集合]:"+layerSetStr);
}

try{
    if(confirm("开始清理后PS会卡住,请耐心等待完成提示。开始清理?")){
        start();
    }
} catch (e) {
    alert("清理失败,请重启PS后重试,错误信息:"+e)
}

操作步骤

1、下载PsDeepCleaner-中文.jsx 文件。

2、在PS中打开巨大的PSD文件(卡了耐心等待一下)。

3、执行脚本(文件-脚本-浏览)

4、载入脚本后,提示是否清理,选择是。(如果文件比较大,PS会卡一会,请耐心等待)

5、清理完成

再看一下你的PSD文件大小,应该已经恢复他本身的体积了。

注:脚本处理过程会消耗比较大的内存,如果清理提示失败,请重启PS并关闭其他占用内存的程序再次尝试。

相关文章

WordPress如何开启 memcached 进行优化加速
WordPress如何开启 Opcache 优化进行加速
WordPress通过redis缓存数据库教程
WordPress完美更换域名方法
WordPress自动给文章标签加内联方法!
WordPress如何添加顶部导航

发布评论