adobe uxp与layer图层

记录使用uxp操作图层的几个功能。

预览图层

Blob url

Data URL

注意:getPixels()的一个奇怪的参数字段: applyAlpha: true

实时预览active图层

uxp使用action.addNotificationListener监听宿主事件。PS图层受影响的事件分别是:

  1. historyStateChanged 历史记录
  2. close 关闭文档
  3. select 切换图层、文档

很多操作会触发select事件,通过过滤可以优化预览次数:

ts 复制代码
const refs = ['document', 'layer']; // 切换事件
if (!descriptor._target?.some((item: { _ref: string }) => refs.includes(item._ref))) return;
// 预览图层
// ...

以png格式读取图层数据

背景:需要把某个图层的数据以png格式保存到云端,待后续使用。但uxp未提供接口把imagedata转换成png文件,也没有提供web canvas的高级用法添加imagedata。本实现借助batchPlay,把单图层保存成临时的png文件。关键代码:

js 复制代码
action.batchPlay([{
    _obj: 'exportSelectionAsFileTypePressed',
    _target: {
        _ref: 'layer',
        _enum: 'ordinal',
        _value: 'targetEnum'
    },
    fileType: 'png',
    quality: 32,
    metadata: 0,
    destFolder: folder.nativePath, // string 临时目录
    sRGB: true,
    openWindow: false,
    _options: {
        dialogOptions: 'dontDisplay'
    },
},
], {});

有了png文件后,使用storage.localFileSystem的方法处理文件,上传数据

ts 复制代码
// 图层中文名要解码
const file = (await folder.getEntry(`${decodeURI(layer.name)}.png`)) as storage.File;
return (await file.read({ format: formats.binary })) as ArrayBuffer;

把图片当作新图层创建

背景:本地或远端图片添加到ps图层中。方法有两种

  1. 把图片转成imagedata(canvas),然后使用imaging方法完成操作。
  2. 使用batchPlay把图片导入到选框selection里。ps为了图片显示,会默认对图片大小做调整,导入后可能需要对图层做layer.scale()缩放。

方法1思路比较简单。难点在把图片转成imagedata,要用到webview(iframe)转换。本文只提供思路。 方法2,把文件置入图层placeEvent关键代码:

ts 复制代码
  await executeAsModal(
    async () =>
      batchPlay(
        [
          {
            _obj: 'placeEvent',
            null: {
              _path: token, // storage.localFileSystem.createSessionToken(file)
              _kind: 'local',
            },
            freeTransformCenterState: {
              _enum: 'quadCenterState',
              _value: 'QCSCorner0',
            },
            offset: {
              _obj: 'offset',
              horizontal: { _unit: 'pixelsUnit', _value: 0.0 },
              vertical: { _unit: 'pixelsUnit', _value: 0.0 },
            },
            _isCommand: true,
            _options: {
              dialogOptions: 'dontDisplay',
            },
          },
        ],
        {}
      ),
    {
      commandName: 'import image file',
    }
  );

总结

uxp插件开发体验类似小程序开发,增加了一些nodejs能力,也弱化了web的能力,比如canvas。操作图片的API还不健全,很多时候只能借助魔法batchPlay处理。

欢迎一起交流学习

参考

相关推荐
安冬的码畜日常9 分钟前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n036 分钟前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。1 小时前
案例-任务清单
前端·javascript·css
zqx_72 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己2 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称3 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色3 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2343 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河3 小时前
CSS总结
前端·css
BigYe程普4 小时前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发