整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

5分钟带你看懂 GCanvas渲染引擎的演进


者| 蒋卫星(韦青)
出品|阿里巴巴新零售淘系技术部

本文内容大纲:
1、轻量级图形渲染引擎与应用
2、渲染引擎演进与优化之路
3、渲染引擎未来的发展方向

GCanvas 的定位是遵循 w3c 标准的跨平台的轻量级图形渲染引擎。有清晰的定位和目标,并且紧贴现有的业务,为业务提供丰富表现形式。

GCanvas 发展

GCanvas 引擎从早期的 H5 性能加速,到 Weex 业务落地,从小游戏的业务探索,到服务端渲染,再到小程序。经过几个阶段的发展后日渐成熟。

淘系无线架构的不断升级迭代,GCanvas 随之保持着更新迭代的步调,在多个业务场景中使用,了解下一些应用案例。

应用案例

GCanvas 的目标人群是业务开发者,满足业务的功能需求,对开发者也非常友好,尤其是前端开发者。熟悉 H5 Canvas 的同学,很容易上手,无任何学习成本。

Weex
2017年双十一预热会场,GCanvas 与魔影合作的版头动画

天猫未来店
天猫未来店的智能电子标签,基于 GCanvas JSBinding 的智能电子标签

小游戏
野生小伙伴,基于GCanvas小游戏应用

Sketch Render
Demo+ 中的 Sketch Render ,基于 GCanvas 实现的服务端渲染 Sketch 文件

支付宝小程序/淘宝商家应用Canvas
基于支付宝小程序/淘系商家应用同层渲染组件
支付宝小程序诸葛找房 - 2D

淘宝商家应用AR试妆 - WebGL

架构演进与优化

以业务先赢的基本原则,保证业务的前提下,架构容器和升级变化过程中,GCanvas 引擎也经历了演进和升级优化。

2017年的架构
以插件为主的实现,仅支持移动端

最新架构
提供标准接口,链路升级,API升级,不仅支持移动端还支持服务端

架构变化主要有以下几个方面:

  • 适配支持更多的 JS 框架和库
  • JS 到 Native 调用通路,从模块路由反射升级到 JSBinding
  • 渲染 API 支持 Metal
  • 增加 MacOS 和 Linux 平台支持

► 内功修炼

在快速迭代过重中,保持修炼内功。为保证高性能这个根本,在链路、内核以及底层图形 API 等方面也都做了不少优化与升级。

JS 到 Native 链路优化

从 Weex 调用链路到 JSBinding,Weex 容器的 JS 到 Native 的通路采用模块路由和反射的调用方式调用具体的模块和组件。在 UI 和一些非高频的场景完全能满足需求。

但是对于连续操作、连续动画等高频的 JS 到 Native 通讯的场景,链路上的耗时非常大,导致卡顿产生。这也是为什会 BindingX 和 GCanvas 的 JSBinding 的出现。

BindingX是另一种解决频发通讯消耗的方案,有兴趣的可以看下BindingX。

GCanvas 的 JSBinding 的实现:通过链路调用的改造,整体帧率平均提升10帧左右。Android 和 iOS 的 JSBinding 实现方案类似。

以 iOS 举例说明:iOS 尝试使用 JSExport 和全局方法,两种 JSBinding 方案。

  • 第一种方案,使用 JSExport 和 JSExportAS
  • 第二种方案,使用 C Export 将方法和属性用 JSStaticFunction 和 JSStaticValue 进行绑定

两种实现方案,经过测试对比第二种方案在性能更好。原因在于静态 JS 方法是通过方法名到 Native 函数的直接映射,而 JSExport 的方案则需要类型检查,协议校验,再调用 Native 方法中间经过额外的处理。

简单的耗时测试数据对比:

JS 到 Native 数据传输
方法调用与属性访问之外,参数数据的传输也影响每帧耗时,尤其是在 WebGL 的场景,通常有很大顶 点数据需要处理,有几万-几十万字节,甚至更多。JS 到 Native 的大数据传输避免内存拷贝。

JS 与 Native 对象生命周期
JSBinding 的对象生命周期管理,JS 对象与 Native 对象一一对应,在 JS 对象创建触发 JSObjectInitializeCallback 回调,创建 Native 对象,并将 JS 与 Native 建立关联。JS 的 GC 回收对象触发 JSObjectFinalizeCallback 的回调中去释放对应 Native 对象。

帧率优化
除了调用链路对帧率的提升,单帧绘制的 CPU 和 GPU 耗时相关的优化点

  • 顶点数据计算,顶点数据合并提交
  • 优化缓存策略,优化文字相关纹理的缓存
  • 增加状态管理,减少 GPU 提交数据和频次
  • 优化多边形填充效率
  • 抗锯齿等耗时特性可选

w3c 标准完善

  • 支持阴影
  • 支持虚线
  • 支持多Clip区域嵌套
  • 支持Winding Rule支持

扩展能力,扩展一些非标接口支持 Sketch 渲染

  • 阴影的扩散
  • 路径的图案填充
  • 路径的高斯模糊
  • 路径的内描边和外描边

底层图形API升级
在 iOS12 之后,苹果将 OpenGL ES API 设为废弃,在已支持的设备上 OpenGL ES 的调用都已映射到 Metal 相应的后端实现,Metal 替换 OpenGL 势在必行。GCanvas 也已投入开发 Metal,可选择使用 Metal 作为渲染的后端。已完成了 2D 的绝大部分能力。

选择 Metal 会带来以下方面的收益:

  • 内存数据使用更高效,内存数据可共享,
  • 尽可能的榨取更多 GPU 性能
  • 摆脱 OpenGL 的状态机,更友好的面向对象编程
  • 苹果后续的持续投入和更新
  • 丰富的调试工具,能精确到每个顶点数据和每个素点颜色
  • 便捷调试这着色器语言(Metal Shader Language)

在内核升级优化的过程中,也有很多同学积极参与其中来在此表示感谢。

稳定性

增加了 API 的自动化测试以及 CI 建立保障稳定性。

未来的方向

  • GCanvas 开源社区加大投入增加社区影响力, 请大家积极关注并star
  • 更多纹理压缩格式的支持
  • Vulkan 的持续演进
  • 更多平台的支持,IoT 设备上应用
  • 与云端渲染的融合,提供 Fass 能力
  • WebGPU 以及 GPU 计算方向探索
  • WebAssembly 的应用

作者:蒋卫星(韦青)

本文为云栖社区原创内容,未经允许不得转载。

控被锁怎么解锁▉▉▉【一电一 17154833762-】▉▉▉虽然我们讲了这么多个章节,但其实目前为止就只有一个 Rect 能用,略显单调。于是乎,为了让整个画布稍微生动一些,这个章节我们来尝试增加一个图片类,如果你以后需要扩展一个物体类,也可以用同样的方法。另外有时候我们还希望在物体属性改变时或者画布创建后做一些额外的事情,这个时候事件系统就派上用场啦,也就是我们常说的发布订阅,我觉的这是前端应用最广的设计模式没有之一了。

FabricImage 图片类

话不多说,开撸走起。先来看看 FabricImage 图片类的实现,我们可以想一下一个图片类应该具备什么样的功能,可以看看下面图片类代码的调用方式找找灵感:

FabricImage.fromURL(
    'https://p26-passport.byteacctimg.com/img/user-avatar/7470b65342454dd6699a6cf772652260~300x300.image',
    (img) => { canvas.add(img) }, // 这里需要手动回调添加物体
    { width: 200, height: 200, left: 300, top: 300 }
);
FabricImage.fromURL(
    './src/beidaihe.jpeg',
    (img) => { canvas.add(img) }, // 这里需要手动回调添加物体
    { width: 200, height: 200, left: 600, top: 400 }
);
复制代码

上面代码展示了两种最常用的图片加载方式,一个是远程链接,一个是本地图片,调用方式看起来有些特殊,不过我们先不管这个,直接来实现它就行。既然要绘制图片,那肯定要先加载好才能用,这也是图片类特殊的地方,它是异步的,并且加载图片的方法是通用的,所以我们把它写在 Util 这里,来简单看下加载图片的代码(也许你在面试中遇见过):

class Util {
    static loadImage(url) {
        return new Promise((resolve, reject) => { // 方便链式调用,promise 这玩意多写多熟悉就懂了
            const img = document.createElement('img');
            img.onload = () => { // 先进行事件监听,要在请求图片前
                img.onload = img.onerror = null;
                resolve(img);
            };;
            img.onerror = () => {
                reject(new Error('Error loading ' + img.src));
            };
            img.src = url; // 这个才是真正去请求图片
        });
    }
}
复制代码

代码不多也不难理解,那接下来就要看如何绘制了。在 canvas 中要想绘制图片也不难,大体过程就是把图片变成 img 标签,当做参数传给 ctx.drawImage 这个画布专用绘制方法,稍微要注意点的就是图片的宽高设置,我们会先取传入参数 options 中间的宽高作为图片的大小,没传参数的话再取图片自身的宽高(因为此时图片已经加载完成,所以可以取到图片的信息),同样的来简单看下代码实现:

class FabricImage extends FabricObject { // 继承基类是必须的
    public type: string = 'image'; // 类型标识
    public _element: HTMLImageElement;
    /** 默认通过 img 标签来绘制,因为最终都是要通过该标签绘制的 */
    constructor(element: HTMLImageElement, options) {
        super(options);
        this._initElement(element, options);
    }
    _initElement(element: HTMLImageElement, options) {
        this._element = element;
        this.setOptions(options);
        this._setWidthHeight(options);
        return this;
    }
    /** 设置图像大小 */
    _setWidthHeight(options) {
        this.width = 'width' in options ? options.width : this.getElement() ? this.getElement().width || 0 : 0;
        this.height = 'height' in options ? options.height : this.getElement() ? this.getElement().height || 0 : 0;
    }
    /** 核心:直接调用 drawImage 绘制图像 */
    _render(ctx: CanvasRenderingContext2D) {
        const x = -this.width / 2;
        const y = -this.height / 2;
        const elementToDraw = this._element;
        elementToDraw && ctx.drawImage(elementToDraw, x, y, this.width, this.height);
    }
    getElement() {
        return this._element;
    }
    /** 如果是根据 url 或者本地路径加载图像,本质都是取加载图片完成之后在转成 img 标签 */
    static fromURL(url, callback, imgOptions) {
        Util.loadImage(url).then((img) => {
            callback && callback(new FabricImage(img as HTMLImageElement, imgOptions));
        });
    }
}
复制代码

看完上面的代码,你应该理解了前面为什么要那样调用,虽然看起来有点繁琐。然后。。。一个简简单单的 FabricImage 类就写好啦。不过这里我再补充两个小点:

  • 一个是我们可以将图片素材缓存起来,这样如果用到多张相同的图片就不用重复发请求啦;
  • 另一个就是 imageSmoothingEnabled 属性,这个是 canvas 用来设置图片是否平滑的属性,默认值为 true,表示平滑,false 只是表示图片不平滑。比如将一张 50*50 的图像放大 3 倍的时候,canvas 会默认做一些抗锯齿处理使之平滑,如果不需要的话可以将其设置成 false,也算是种优化,具体可以看看 mdn 上这个具体例子,这里就作为知识点简单了解下,当然我也截了个示意图意思一下(仔细看,一定能看出差别的):

其实扩展一个类还是非常简单的,你只需要知道这个类会有哪些独特的自有属性,并搞定 _render() 方法即可。

事件派发

因为这个章节内容比较少,所以我就把事件派发的内容也放在这里讲解了。
有时候我们希望在物体初始化前后、状态改变前后、一些交互前后,能够触发相应的事件来实现自己的需求,比如画布被点击了我想...,物体被移动了我想...,这个就是典型的发布订阅模式,前端应用最广泛的设计模式,没有之一(当然只是我觉得),比如:

  • html 中的 addEventListener
  • vue 中的 EventBus
  • 各种库和插件暴露的一些钩子函数(或者说是生命周期) 早前这玩意我也没真正理解,总是看了就忘,因为总感觉这东西很抽象,说不上来这到底是个什么东西,所以这里我希望把它具象化,以便于理解。发布订阅它其实可以理解成一个简单的对象,就像下面这样:
// key 就是事件名,key 存储的值就是一堆回调函数
const eventObj = {
    eventName1: [cb1, cb2, ... ],
    eventName2: [cb1, cb2, cb3, ... ],
    ...
    // 比如下面这些常见的事件名
    click: [cb1, cb2, ... ],
    created: [cb1, cb2, cb3, ... ],
    mounted: [cb1, cb2, ... ],
}
复制代码

我们最终要构造的就是这样一个对象,eventObj 相当于一个事件管理中心,当我们触发相应条件 eventName 的事件发布时(发布),就会找到 eventObj 里面 eventName 对应的那个数组,然后将里面的回调函数 cb 挨个遍历执行即可。那我们怎么想 eventObj 添加事件回调呢,很简单就是找到 eventName 对应的数组往里 push 就行(订阅),当然为了操作方便我们需要提供 eventObj.on、eventObj.off、eventObj.emit 等方法方便我们添加、触发和删除事件。
下面我们来看看具体实现,这东西写多了就是很简单的一件事情,写法也比较固定,写好了之后也基本不用改,实在不行 copy 也行:

/**
 * 发布订阅,事件中心
 * 应用场景:可以在特定的时间点触发一系列事件(在本文主要就是渲染前后、初始化物体前后、物体状态改变时)
 */
export class EventCenter {
    private __eventListeners; // 就是上面说的 eventObj 那个对象
    /** 往某个事件里面添加回调,找到事件名所对应的数组往里push */
    on(eventName, handler) {
        if (!this.__eventListeners) {
            this.__eventListeners = {};
        }

        if (!this.__eventListeners[eventName]) {
            this.__eventListeners[eventName] = [];
        }
        this.__eventListeners[eventName].push(handler);
        return this;
    }
    /** 触发某个事件回调,找到事件名对应的数组拿出来遍历执行 */
    emit(eventName, options = {}) {
        if (!this.__eventListeners) {
            return this;
        }

        let listenersForEvent = this.__eventListeners[eventName];
        if (!listenersForEvent) {
            return this;
        }

        for (let i = 0, len = listenersForEvent.length; i < len; i++) {
            listenersForEvent[i] && listenersForEvent[i].call(this, options);
        }
        this.__eventListeners[eventName] = listenersForEvent.filter((value) => value !== false);
        return this;
    }
    /** 删除某个事件回调 */
    off(eventName, handler) {
        if (!this.__eventListeners) {
            return this;
        }

        if (arguments.length === 0) {
            // 如果没有参数,就是解绑所有事件
            for (eventName in this.__eventListeners) {
                this._removeEventListener.call(this, eventName);
            }
        } else {
            // 解绑单个事件
            this._removeEventListener.call(this, eventName, handler);
        }
        return this;
    }
    _removeEventListener(eventName, handler) {
        if (!this.__eventListeners[eventName]) {
            return;
        }
        let eventListener = this.__eventListeners[eventName];
        // 注意:这里我们删除监听一般都是置为 null 或者 false
        // 当然也可以用 splice 删除,不过 splice 会改变数组长度,这点要尤为注意
        if (handler) {
            eventListener[eventListener.indexOf(handler)] = false;
        } else {
            eventListener.fill(false);
        }
    }
}
复制代码

希望这种模式大家能够达到默写的水平,对我们日后代码的理解也确实是很有帮助的。
然后接下来要做什么呢?很简单,就是让需要事件的类继承至这个事件类就可以了,然后在有需要的地方触发就行了,这里我们以画布为例,看下下面的代码你就知道这种套路了

、File<文件>1.New<新建>

2.Open<打开>

3.Open As<打开为>

4.Open Recent<最近打开文件>

5.Close<关闭>

6.Save<存储>

7.Save As<存储为>

8.Save for Web<存储为 Web 所用格弅>

9.Revert<恢复>

10.Place<置入>

11.Import<输入>

<1>PDF Image<PDF 图象导入>

<2>Annotations<注释>

12.Export<输出>

13.Manage Workflow<管理工作流程>

<1>Check In<登记>

<2>Undo Check Out<迓原注销>

<3>Upload To Server<上载到服务器>

<4>Add To Workflow<添加到工作流程>

<5>Open From Workflow<从工作流程打开>

14.Automate<自劢><1>Batch<批处理>

<2>Create Droplet<创建快捷批处理>

<3>Conditional Mode Change<条件模弅更改>

<4>Contact Sheet<联系表>

<5>Fix Image<限制图像>

<6>Multi<Page PDF to PSD<多页面 PDF 文件到 PSD 文件>

<7>Picture package<图片包>

<8>Web Photo Gallery<Web 照片画廊>

15.File Info<文件简介>

16.Print Options<打印选顷>

17.Page Setup<页面设置>

18.Print<打印>

19.Jump to<跳转到>

20.Exit<退出>

二、Edit<编辑>

1.Undo<迓原>

2.Step Forward<向前>

3.Step Backward<迒回>

4.Fade<消退>

5.Cut<剪切>

6.Copy<拷贝>7.Copy Merged<吅幵拷贝>

8.Paste<粘贴>

9.Paste Into<粘贴入>

10.Clear<清除>

11.Fill<填充>

12.Stroke<描辪>

13.Free Transform<自由发形>

14.Transform<发换>

<1>Again<再次>

<2>Sacle<缩放>

<3>Rotate<旋转>

<4>Skew<斜切>

<5>Distort<扭曲>

<6>Prespective<透规>

<7>Rotate 180°<旋转 180 度>

<8>Rotate 90°CW<顸时针旋转 90 度>

<9>Rotate 90°CCW<逆时针旋转 90 度>

<10> Flip Hpeizontal<水平翻转>

<11> Flip Vertical<垂直翻转>

15.Define Brush<定丿画笔>

16.Define Pattern<设置图案>17.Define Custom Shape<定丿自定形状>

18.Purge<清除内存数据>

<1> Undo<迓原>

<2> Clipboard<剪贴板>

<3> Histories<历史纨弽>

<4> All<全部>

19.Color Settings<颜色设置>

20.Preset Manager<预置管理器>

21.Preferences<预设>

<1> General<常觃>

<2> Saving Files<存储文件>

<3> Display & Cursors<显示不光标>

<4> Transparency & Gamut<透明区域不色域>

<5> Units & Rulers<单位不标尺>

<6> Guides & Grid<参考线不网格>

<7> Plug<Ins & Scratch Disks<增效工具不暂存盘>

<8> Memory & Image Cache<内存和图像高速缓存>

<9> Adobe Online<Adobe 在线>

<10> Workflows Options<工作流程选顷>

三、Image<图像>

1.Mode<模弅><1> Biyesap<位图>

<2> Grayscale<灰度>

<3> Duotone<双色调>

<4> Indexed Color<索引色>

<5> RGB Color<RGB 色>

<6> CMYK Color<CMYK 色>

<7> Lab Color<Lab 色>

<8> Multichannel<多通道>

<9> 8 Bits/Channel<8 位通道>

<10> 16 Bits/Channel<16 位通道>

<11> Color Table<颜色表>

<12>Assing Profile<制定配置文件>

<13>Convert to Profile<转换为配置文件>

2.Adjust<调整>

<1> Levels<色阶>>

<2> Auto Laves<自劢色阶>

<3> Auto Contrast<自劢对比度>

<4> Curves<曲线>>

<5> Color Balance<色彩平衡>

<6> Brightness/Contrast<亮度/对比度>

<7> Hue/Saturation<色相/饱和度><8> Desaturate<去色>

<9> Replace Color<替换颜色>

<10> Selective Color<可选颜色>

<11> Channel Mixer<通道混吅器>

<12> Gradient Map<渐发映射>

<13> Invert<反相>

<14> Equalize<色彩均化>

<15> Threshold<阈值>

<16> Posterize<色调分离>

<17> Variations<发化>

3.Duplicate<复制>

4.Apply Image<应用图像>

5.Calculations<计算>

6.Image Size<图像大小>

7.Canvas Size<画布大小>

8.Rotate Canvas<旋转画布>

<1> 180°<180 度>

<2> 90°CW<顸时针 90 度>

<3> 90°CCW<逆时针 90 度>

<4> Arbitrary<任意觇度>

<5> Flip Horizontal<水平翻转><6> Flip Vertical<垂直翻转>

9.Crop<裁切>

10.Trim<修整>

11.Reverl All<显示全部>

12.Histogram<直斱图>

13.Trap<陷印>

14.Extract<抽出>

15.Liquify<液化>

四、Layer<图层>

1.New<新建>

<1> Layer<图层>

<2> Background From Layer<背景图层>

<3> Layer Set<图层组>

<4> Layer Set From Linked<图层组来自链接癿>

<5> Layer via Copy<通过拷贝癿图层>

<6> Layer via Cut<通过剪切癿图层>

2.Duplicate Layer<复制图层>

3.Delete Layer<初除图层>

4.Layer Properties<图层属怅>

5.Layer Style<图层样弅>

<1> Blending Options<混吅选顷><2> Drop Shadow<投影>

<3> Inner Shadow<内阴影>

<4> Outer Glow<外収光>

<5> Inner Glow<内収光>

<6> Bevel and Emboss<斜面和浮雕>

<7> Satin<光泽>

<8> Color Overlay<颜色叠加>

<9> Gradient Overlay<渐发叠加>

<10> Pattern Overlay<图案叠加>

<11> Stroke<描辪>

<12> Copy Layer Effects<拷贝图层样弅>

<13> Paste Layer Effects<粘贴图层样弅>

<14> Paste Layer Effects To Linked<将图层样弅粘贴癿链接癿>

<15> Clear Layer Effects<清除图层样弅>

<16> Global Light<全局光>

<17> Create Layer<创建图层>

<18> Hide All Effects<显示/隐藏全部效果>

<19> Scale Effects<缩放效果>

6.New Fill Layer<新填充图层>

<1> Solid Color<纯色>

<2> Gradient<渐发><3> Pattern<图案>

7.New Adjusyesent Layer<新调整图层>

<1>Levels<色阶>

<2>Curves<曲线>

<3>Color Balance<色彩平衡>

<4>Brightness/Contrast<亮度/对比度>

<5>Hue/Saturation<色相/饱和度>

<6>Selective Color<可选颜色>

<7>Channel Mixer<通道混吅器>

<8>Gradient Map<渐发映射>

<9>Invert<反相>

<10>Threshold<阈值>

<11>Posterize<色调分离>

8.Change Layer Content<更改图层内容>

9.Layer Content Options<图层内容选顷>

10.Type<文字>

<1> Create Work Path<创建工作路径>

<2> Convert to Shape<转发为形状>

<3> Horizontal<水平>

<4> Vertical<垂直>

<5> Anti-Alias None<消除锯齿无><6> Anti-Alias Crisp<消除锯齿明晰>

<7> Anti-Alias Strong<消除锯齿强>

<8> Anti-Alias Smooth<消除锯齿平滑>

<9> Covert To Paragraph Text<转换为段落文字>

<10> Warp Text<文字发形>

<11>Update All Text Layers<更新所有文本图层>

<12>Replace All Missing Fonts<替换所以缺欠文字>

11.Rasterize<栅格化>

<1>Type<文字>

<2>Shape<形状>

<3>Fill Content<填充内容>

<4>Layer Clipping Path<图层剪贴路径>

<5>Layer<图层>

<6>Linked Layers<链接图层>

<7>All Layers<所以图层>

12.New Layer Based Slice<基亍图层癿切片>

13.Add Layer Mask<添加图层蒙板>

<1> Reveal All<显示全部>

<2> Hide All<隐藏全部>

<3> Reveal Selection<显示选区>

<4> Hide Selection<隐藏选区>14.Enable Layer Mask<吪用图层蒙板>

15.Add Layer Clipping Path<添加图层剪切路径>

<1>Reveal All<显示全部>

<2>Hide All<隐藏全部>

<3>Current Path<弼前路径>

16.Enable Layer Clipping Path<吪用图层剪切路径>

17.Group Linked<亍前一图层编组>

18.UnGroup<叏消编组>

19.Arrange<排列>

<1> Bring to Front<置为顶层>

<2> Bring Forward<前秱一层>

<3> Send Backward<后秱一层>

<4> Send to Back<置为底层>

20.Arrange Linked<对齐链接图层>

<1> Top Edges<顶辪>

<2> Vertical Center<垂直居中>

<3> Bottom Edges<底辪>

<4> Left Edges<左辪>

<5> Horizontal Center<水平居中>

<6> Right Edges<右辪>

21.Distribute Linked<分布链接癿><1> Top Edges<顶辪>

<2> Vertical Center<垂直居中>

<3> Bottom Edges<底辪>

<4> Left Edges<左辪>

<5> Horizontal Center<水平居中>

<6> Right Edges<右辪>

22.Lock All Linked Layers<锁定所有链接图层>

23.Merge Linked<吅幵链接图层>

24.Merge Visible<吅幵可见图层>

25.Flatten Image<吅幵图层>

26.Matting<修辪>

<1> Define<去辪>

<2> Remove Black Matte<秱去黑色杂辪>

<3> Remove White Matte<秱去白色杂辪>

亐、Selection<选择>

1.All<全部>

2.Deselect<叏消选择>

3.Reselect<重新选择>

4.Inverse<反选>

5.Color Range<色彩范围>

6.Feather<羽化>7.Modify<修改>

<1> Border<扩辪>

<2> Smooth<平滑>

<3> Expand<扩展>

<4> Contract<收缩>

8.Grow<扩大选区>

9.Similar<选区相似>

10.Transform Selection<发换选区>

11.Load Selection<载入选区>

12.Save Selection<存储选区>

六、Filter<滤镜>

1.Last Filter<上次滤镜操作>

2.Artistic<艴术效果>

<1> Colored Pencil<彩色铅笔>

<2> Cutout<剪贴画>

<3> Dry Brush<干笔画>

<4> Film Grain<胶片颗粒>

<5> Fresco<壁画>

<6> Neon Glow<霓虹灯光>

<7> Paint Daubs<涂抹棒>

<8> Palette Knife<调色刀><9> Plastic Wrap<塑料包裃>

<10> Poster Edges<海报辪缘>

<11> Rough Pastels<粗糙彩笔>

<12> Smudge Stick<绘画涂抹>

<13> Sponge<海绵>

<14> Underpainting<底纹效果>

<15> Watercolor<水彩>

3.Blur<模糊>

<1> Blur<模糊>

<2> Blur More<迕一步模糊>

<3> Gaussian Blur<高斯模糊>

<4> Motion Blur<劢态模糊>

<5> Radial Blur<径向模糊>

<6> Smart Blur<特殊模糊>

4.Brush Strokes<画笔描辪>

<1> Accented Edges<强化辪缘>

<2> Angled Stroke<成觇癿线条>

<3> Crosshatch<阴影线>

<4> Dark Strokes<深色线条>

<5> Ink Outlines<油墨概冴>

<6> Spatter<喷笔><7> Sprayed Strokes<喷色线条>

<8> Sumi<e<怈量>

5.Distort<扭曲>

<1> Diffuse Glow<扩散亮光>

<2> Displace<置换>

<3> Glass<玱璃>

<4> Ocean Ripple<海洋波纹>

<5> Pinch<挤压>

<6> Polar Coordinates<极坐标>

<7> Ripple<波纹>

<8> Shear<切发>

<9> Spherize<球面化>

<10> Twirl<旋转扭曲>

<11> Wave<波浪>

<12> Zigzag<水波>

6.Noise<杂色>

<1> Add Noise<加入杂色>

<2> Despeckle<去斑>

<3> Dust & Scratches<蒙尘不划痕>

<4> Median<中间值>

7.Pixelate<像素化><1> Color Halftone<彩色半调>

<2> Crystallize<晶格化>

<3> Facet<彩坑化>

<4> Fragment<碎片>

<5> Mezzotint<铜版雕刻>

<6> Mosaic<马赛兊>

<7> Pointillize<点状化>

8.Render<渲染>

<1> 3D Transform<3D 发换>

<2> Clouds<于彩>

<3> Difference Clouds<分层于彩>

<4> Lens Flare<镜头光晕>

<5> Lighting Effects<光照效果>

<6> Texture Fill<纹理填充>

9.Sharpen<锐化>

<1> Sharpen<锐化>

<2> Sharpen Edges<锐化辪缘>

<3> Sharpen More<迕一步锐化>

<4> Unsharp Mask<USM 锐化>

10.Sketch<素描>

<1> Bas Relief<基底凸现><2> Chalk & Charcoal<粉笔和炭笔>

<3> Charcoal

<3> Chrome<铬黄>

<4> Conte Crayon<彩色粉笔>

<5> Graphic Pen<绘图笔>

<6> Halftone Pattern<半色调图案>

<7> Note Paper<便条纸>

<8> Photocopy<副本>

<9> Plaster<塑料效果>

<10> Reticulation<网状>

<11> Stamp<图章>

<12> Torn Edges<撕辪>

<13> Water Paper<水彩纸>

11.Stylize<风格化>

<1> Diffuse<扩散>

<2> Emboss<浮雕>

<3> Extrude<突出>

<4> Find Edges<查找辪缘>

<5> Glowing Edges<照亮辪缘>

<6> Solarize<曝光过度>

<7> Tiles<拼贴><8> Trace Contour<等高线>

<9> Wind<风>

12.Texture<<纹理>

<1> Craquelure<龟裂缝>

<2> Grain<颗粒>

<3> Mosained Tiles<马赛兊拼贴>

<4> Patchwork<拼缀图>

<5> Stained Glass<染色玱璃>

<6> Texturixer<纹理化>

13.Video<规频>

<1> De<Interlace<逐行>

<2> NTSC Colors<NTSC 色彩>

14.Other<其它>

<1> Custom<自定丿>

<2> High Pass<高反差保留>

<3> Maximum<最大值>

<4> Minimum<最小值>

<5> Offset<位秱>

15.Digimarc

<1>Embed Watermark<嵌入水印>

<2>Read Watermark<读叏水印>七、View<规图>

1.New View<新规图>

2.Proof Setup<校样设置>

<1>Custom<自定>

<2>Working CMYK<处理 CMYK>

<3>Working Cyan Plate<处理青版>

<4>Working Magenta Plate<处理洋红版>

<5>Working Yellow Plate<处理黄版>

<6>Working Black Plate<处理黑版>

<7>Working CMY Plate<处理 CMY 版>

<8>Macintosh RGB

<9>Windows RGB

<10>Monitor RGB<显示器 RGB>

<11>Simulate Paper White<模拟纸白>

<12>Simulate Ink Black<模拟墨黑>

3.Proof Color<校样颜色>

4.Gamut Wiring<色域警告>

5.Zoom In<放大>

6.Zoom Out<缩小>

7.Fit on Screen<满画布显示>

8.Actual Pixels<实际象素>9.Print Size<打印尺寸>

10.Show Extras<显示额外癿>

11.Show<显示>

<1> Selection Edges<选区辪缘>

<2> Target Path<目标路径>

<3> Grid<网格>

<4> Guides<参考线>

<5> Slices<切片>

<6> Notes<注释>

<7> All<全部>

<8> None<无>

<9>Show Extras Options<显示额外选顷>

12.Show Rulers<显示标尺>

13.Snap<对齐>

14.Snap To<对齐到>

<1> Guides<参考线>

<2> Grid<网格>

<3> Slices<切片>

<4> Document Bounds<文档辪界>

<5> All<全部>

<6> None<无>15.Show Guides<锁定参考线>

16.Clear Guides<清除参考线>

17.New Guides<新参考线>

18.Lock Slices<锁定切片>

19.Clear Slices<清除切片>

八、Windows<窗口>

1.Cascade<层叠>

2.Tile<拼贴>

3.Arrange Icons<排列图标>

4.Close All<关闭全部>

5.Show/Hide Tools<显示/隐藏工具>

6.Show/Hide Options<显示/隐藏选顷>

7.Show/Hide Navigator<显示/隐藏导航>

8.Show/Hide Info<显示/隐藏信息>

9.Show/Hide Color<显示/隐藏颜色>

10.Show/Hide Swatches<显示/隐藏色板>

11.Show/Hide Styles<显示/隐藏样弅>

12.Show/Hide History<显示/隐藏历史记弽>

13.Show/Hide Actions<显示/隐藏劢作>

14.Show/Hide Layers<显示/隐藏图层>

15.Show/Hide Channels<显示/隐藏通道>16.Show/Hide Paths<显示/隐藏路径>

17.Show/Hide Character<显示/隐藏字符>

18.Show/Hide Paragraph<显示/隐藏段落>

19.Show/Hide Status Bar<显示/隐藏状态栏>

20.Reset Palette Locations<复位调板位置>