【CEP教程

您所在的位置:网站首页 ps分图层导出图片 【CEP教程

【CEP教程

2024-07-06 12:33| 来源: 网络整理| 查看: 265

在做Ps插件开发的时候,一个非常常见的功能就是导出图片,有时候我们需要导出整个PSD文档,有时候我们需要导出某个图层或某个几个图层,市面上所有的和UI切图有关的产品和插件,都是运用了插件的图像导出能力来完成这个诉求。本篇文章我们就主要来介绍如何从Ps中获取图像,或许各种格式的图像。

1. 输出文档图片内容

对于导出一整个文档来说,其实是比较简单的,我们查看DOM的API文档就能找到对应的方法

这个方法,就是Ps默认的导出到web格式的实现,导出的格式,其中重点关注最后一个参数ExportOptionsSaveForWeb,通过这个参数的配置,可以输出不同格式、质量的图片,这里给一些例子

12345678// 输出PNG格式图片var pngOption = new ExportOptionsSaveForWeb(); pngOption.format = SaveDocumentType.PNG; pngOption.PNG8 = false; // true就是输出png8格式,false对应输出png24 pngOption.quality = 100;var file = new File("path/to/filename");app.activeDocument.exportDocument(file, ExportType.SAVEFORWEB, pngOption);

同样的,如果要输出其它格式的图片,设置对应的format就可以了

12345678910111213// 输出JPEG图片格式var jpegOption = new ExportOptionsSaveForWeb(); jpegOption.format = SaveDocumentType.JPEG; jpegOption.optimized = true; jpegOption.quality = 100; // 输出GIFvar gifOption = new ExportOptionsSaveForWeb(); gifOption.colors = this.config.gifValue; gifOption.PNG8 = true; gifOption.colorReduction = ColorReductionType.SELECTIVE; // 可选择 gifOption.quality = 0; // 这里设置0是为了解决lossy设置不生效的bug gifOption.dither = Dither.NONE; // 无仿色

上面这3种图片格式是比较常见的,PS自身提供的fomat类型非常多,但是一般我们也用不上,这里就不多做介绍了,基本上上面3中类型大体够用了。

2. 输出图层内容

上面的代码,可以将当前打开的整个PSD文档进行图片输出,但是很多时候,我们不要输出整个文档,我们只想导出某个图层的内容,那这个时候该怎么办呢?我们找遍DOM API也找不到可以单独输出图层的方法,Action Manager也没有现成的办法。这种时候,我们可以通过手动操作PS来完成这个事情,然后将这些动作用不同的脚本片段串起来,就可以达到目的了。

整体操作流程如下: 选中需要导出的图层 -> 右键,选择复制图层 -> 在弹出的框里头选择新建文档 -> 该图层会被复制出一个新文档来 -> 菜单栏,图片,裁切,将边缘透明元素裁剪掉,就得到了该图层一个完整的新文档了,这样,我们就可以通过上面的方法将此文档进行导出,流程操作示意图如下:

于是,我们将这几个操作步骤,通过脚本来进行封装,然后串联起来,就实现了导出某个图层的脚本了

由于这些操作都是对Ps进行设置,所以你可以在Ps输出的日志文件(ScriptingListenerJS.log)里头找到对应的Action Manager代码,直接抄作业就可以了

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051// 步骤一:复制选中的图层到一个新的文档// 确保当前有选中的图层function duplicateLayer() { var desc1 = new ActionDescriptor(); var ref1 = new ActionReference(); ref1.putClass(stringIDToTypeID("document")); desc1.putReference(stringIDToTypeID("null"), ref1); var ref2 = new ActionReference(); ref2.putEnumerated(stringIDToTypeID("layer"), stringIDToTypeID("ordinal"), stringIDToTypeID("targetEnum")); desc1.putReference(stringIDToTypeID("using"), ref2); desc1.putInteger(stringIDToTypeID("version"), 5); executeAction(stringIDToTypeID("make"), desc1, DialogModes.NO);}// 步骤二: 对新复制出来的文档,裁切掉透明的边缘部分// 确保选中了这个新复制出来的图层function trimDocument() { var desc1 = new ActionDescriptor(); desc1.putEnumerated(stringIDToTypeID("trimBasedOn"), stringIDToTypeID("trimBasedOn"), stringIDToTypeID("transparency")); desc1.putBoolean(stringIDToTypeID("top"), true); desc1.putBoolean(stringIDToTypeID("bottom"), true); desc1.putBoolean(stringIDToTypeID("left"), true); desc1.putBoolean(stringIDToTypeID("right"), true); executeAction(stringIDToTypeID("trim"), desc1, DialogModes.NO);}// 步骤三: 将此新复制出来的文档进行输出// 支持输出对应的格式function exportDocument(format, path) { var options = new ExportOptionsSaveForWeb(); if (format == SaveDocumentType.PNG) { options.format = SaveDocumentType.PNG; options.PNG8 = false; options.quality = 100; } else if (format == SaveDocumentType.JPEG) { options.format = SaveDocumentType.JPEG; options.optimized = true; options.quality = this.config.jpegValue; } else if (format == SaveDocumentType.COMPUSERVEGIF) { options.format = SaveDocumentType.COMPUSERVEGIF; options.colors = this.config.gifValue; options.PNG8 = true; options.colorReduction = ColorReductionType.SELECTIVE; // 可选择 options.quality = 0; // 这里设置0是为了解决lossy设置不生效的bug options.dither = Dither.NONE; // 无仿色 } var file = new File(path); app.activeDocument.exportDocument(file, ExportType.SAVEFORWEB, options);}

有了这些分步骤的脚本函数之后,我们就可以将他们串起来,挨个执行一遍,就可以输出想要的图层了,就好比Ps自带的那个动作一样一样滴。

3. 遍历输出多个图层

上面的代码组合,可以帮助我们输出单个图层内容,当我们需要输出多个图层,或者遍历图层输出的时候,需要一些特殊的处理,比如每次新复制出来的图层文档,在导出之后得把它关闭了,重新回到目标文档,以及需要记录目标图层的索引,进行循环遍历。下面以循环输出选中的图层为例子来展示一下,当用户选中多个图层的时候,遍历输出选中的每一个图层。

我在【CEP教程-10】图层处理那些事那篇教程中写了一个Layer类,里面有获取用户选中图层的方法,这里就直接引用了,没有印象的小伙伴自行复习。

1234567891011121314151617181920212223// 自行引入layer.jsx文件// 获取当前选中的图层var layers = Layer.getSelectedLayers();if (layers.length === 0) { alert("You have not selected layer yet!"); return}// 遍历每个图层进行导出for (var i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3