获取从 Photoshop 到 Inkscape 或 SVG 的矢量路径

平面设计 adobe-photoshop 向量
2022-02-13 12:38:22

我需要将 Photoshop 中的矢量路径提取为 SVG 格式(或 Inkscape 可以使用的任何其他格式)。

我没有 Illustrator,购买它只是为了转换文件格式似乎很愚蠢。

那么如何将路径从 Photoshop 转换为 SVG?

如果需要,我可以编写一些代码来直接操作文件,但我什至不确定从哪里开始获取路径。

4个回答

我意识到这是一个 2012 年的问题……但在 2018 年……

从 Photoshop 导出为 SVG .. 路径将在那里。

您可能需要删除一堆光栅填充,但路径都将在那里。

编辑:

本教程似乎有效,它适用于 Mac,但您可能可以替换 Win 的中间步骤。


我自己没有尝试过,但这些资源可能会对您有所帮助:

如果他们中的任何一个有帮助或者您找到了替代方法,请将其发布以供将来参考:)

GIMP 可以做到这一点。打开 .psd 并转到路径选项卡,右键单击任何路径,然后有一个导出选项。

Photoshop 可以像@Scott 提到的那样导出 SVG。但是,这对您的工作流程来说可能是也可能不是一个好的举措,因为您可能需要从一个非常大的东西列表中找到路径。也可以使用脚本读取路径信息,除了允许您选择要导出的内容之外,还允许您自定义导出器,并且它适用于更旧版本的 PS。

因为我已经在这里完成了,所以我将把它逐字粘贴在这里:

// jooExportSVGScaffold.jsx
#target photoshop

main();

function ppos(point){
    return ""+point[0]+" "+point[1] 
}


function handlePath(path) {
    var out = "";    
    var pnts = path.pathPoints;

    var ipos = pnts[0].anchor;

    var pos = pnts[0].leftDirection;
    var pos2, pos3;
    out="M"+ppos(ipos);
    for (var p=1; p<pnts.length; p++){
       pos2 = pnts[p].rightDirection;
       pos3 = pnts[p].anchor;
       out += "C"+ppos(pos)+" "+ppos(pos2)+" "+ppos(pos3);
       pos = pnts[p].leftDirection;
    }
    if (path.closed){
        pos2 = pnts[0].rightDirection;
        pos3 = pnts[0].anchor;
        out += "C"+ppos(pos)+" "+ppos(pos2)+" "+ppos(pos3)+"Z";
    }
    return out;
}

function main() {
    var sel = app.activeDocument.selection; 
    var file = File.saveDialog('save svg path', 'SVGPath:*.svg');

    file.open('w');

    file.writeln('<?xml version="1.0" encoding="utf-8"?>');
    file.writeln('<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">');
    file.writeln('<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"');
    file.writeln('width="595.28px" height="841.89px" viewBox="0 0 595.28 841.89" enable-background="new 0 0 595.28 841.89" xml:space="preserve">');


    var doc = app.activeDocument;
    var paths = doc.pathItems;

    for (var i=0; i<paths.length; i++){
        var subpaths = paths[i].subPathItems;

        for (var j=0; j<subpaths.length; j++){
            data=handlePath(subpaths[j]);  
            file.writeln('<path fill="none" stroke="black" d="'+data+'"/>');
        }
    }
    file.writeln('</svg>'); 
    file.close();
}

您可以根据需要更改脚本。例如,不是写入文件,而是将其显示在文本框中或复制到剪贴板,而是根据路径名等放置一个 Id。毕竟我不知道它是您的工作流程。