对Photoshop第三方滤镜插件开发的简介

       photoshop是数字图像处理领域内的杰出软件。同时,它也允许第三方以插件(plugin) 的形式扩展其功能。photoshop的插件目前一共可分为以下九种:自动化(批处理)(出现在‘自动’子菜单下),颜色拾取,导入,导出(出现在‘导入’‘导出’子菜单下),扩展,滤镜,文件格式(出现在打开,存储为),解析(与导出导出功能),选取(出现在‘选择’菜单下)。这里我们以最为用户熟悉的滤镜为例讲解。
(一)插件的通用部分介绍:
        调用插件的主程序我们成为宿主,在大多数情况下就是photoshop(以下简称ps),一个插件实际上在windows系统下是一个动态链接库(只是具有不同扩展名)。ps使用loadlibray加载插件模块。当用户采取相应操作时,将引起一系列ps对插件模块的调用。所有的这些调用都是调用同一个入口点。该入口点是这样一个函数,定义如下:(由于ps采取对windows和苹果机兼容,这里我们只给出在windows系统上的定义)

void entrypoint (
         short selector,
         void* pluginparamblock,
         long* plugindata,
         short* result);

selector:
      操作类型指示符。当seletor=0时,它对所有类型的插件都具有相同的意义,即要求显示一个关于对话框。其他值,则根据插件类型而意义有所不同。

pluginparamblock:
      这是一个指向一个很大结构的指针,这个结构用于在宿主和插件之间传递信息和数据。对于不同类型插件,它具有不同结构。

plugindata:
       一个指向int32类型的指针。它是为ps为插件在多次调用期间保存的一个值。它的一个标准用法是插件可把一些全局数据的指针交给该参数保存,

result:
       一个指向int16的指针,每次插件被调用它必须设置result。返回0表示插件代码中没有发生错误。当发生错误时,这个值返回一个错误码。有关错误码,ps为不同类型的插件分别划分了错误码的范围,并在sdk中预定义了一些值。

关于对话框:
所有插件应该响应about调用。插件可以显示一个自定义的对话框。但是为了保持一致性,应该遵守下面的约定:
(1)显示在主屏幕的水平居中,垂直1/3高度处。
(2)不需要包含一个ok按钮,而是响应在任意位置的点击以及回车键。

(二)滤镜插件的介绍
滤镜插件的作用是,针对图像的选择区域做出修改。滤镜行为从调节饱和度,亮度,到对图像的滤波等等。滤镜在windows下的扩展名是“.8bf”。
下图显示了ps和滤镜插件之间的调用序列,非常重要,这是在sdk文档中的一个图片,对每一个类型的插件都有这样一幅图,这里显示的是滤镜插件的调用序列。
               对Photoshop第三方滤镜插件开发的简介
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.php.cn/

–>// Create a definition for exported functions
#define DLLExport extern “C” __declspec(dllexport)
#define SPAPI

DLLExport SPAPI void PluginMain(const int16 selector,
        void * filterRecord,
        int32 * data,
        int16 * result)

 switch (selector)
 {
  case filterSelectorAbout:
   //DoAbout();
   break;
  case filterSelectorParameters:
   DoParameters();
   break;
  case filterSelectorPrepare:
   DoPrepare();
   break;
  case filterSelectorStart:
   DoStart();
   break;
  case filterSelectorContinue:
   DoContinue();
   break;
  case filterSelectorFinish:
   DoFinish();
   break;
  default:
   *gResult = filterBadParameters;
   break;
 }
}

注意,上面这个函数就是我们的滤镜的最重要的一个函数,因为这个函数是提供给PS调用的,我们可以看到这个函数声明为了一个Dll导出函数。从调用序列可以看到,这个机制使得这个函数的作用和 窗口的窗口过程 非常类似。窗口过程用于根据MSG ID处理消息,而这个函数主要用于根据selector做相应操作。因此他们都是有包含一个switch-case分支处理结构。

filterRecord
上面这个函数中用到的第二个参数,当属于about调用时(即selector=0)它是一个指向AboutRecord结构的指针,当非about调用时,他是一个指向FilterRecord结构的指针,FilterRecord结构是一个非常庞大复杂的结构,它是ps和滤镜之间用于沟通和传递数据的关键载体,它的sizeof=452个字节,大约包含100多个成员,在文档中一共有7页用于介绍该结构的成员含义。FilterRecord的完整定义位于头文件:sdk中的pifilter.h。下面我将在提到时再去讲解它最基本和最重要的一些成员。

(三)调用流程简介。

(3.1)filterSelectorParameters调用:
如果滤镜有一些参数需要用户设置,那么它应该把参数保存到一个位置。然后把该地址设置到第三个参数data。PS将把这个参数初始化为NULL。这个调用是否发生取决于用户的调用方式,当一个滤镜刚刚调用后,这个滤镜将出现在滤镜的最近一次命令菜单,用户可以以此菜单以相同参数(这时不会显示对话框要求用户设置新的参数)再次调用。当用户使用最后一次滤镜命令调用时,该调用不会发生。(参加上图)。因此,如果错误的参数可能产生使程序崩溃的危险时,应该每一次都检查,验证,然后初始化参数。
      注意!:因为对对不同大小的图像可以用同样的参数,所以参数不应该依赖图像大小。例如,某个参数不应该取决于图像宽度或者高度,通常应该用一个百分比或者比例系数作为参数比较合适。
      所以,你的参数数据块应该包含以下信息:
       1. 一个签名,这样滤镜可以快速的确认这是属于它的参数数据。
       2.一个版本号,这样插件可以自由升级而无需改变签名。
       3.字节序标识。(为了跨平台)指示当前使用的是什么字节序。

      Parameter block (参数数据块)和scripting system (脚本描述系统)
      脚本描述系统用于缓存我们的参数,在每种调用类型都会把它传递给插件,因此可以使用它存储你的所有参数。一旦你的Parameter block通过验证,你都应该从传递的参数读取数据,然后更新你的参数。例如:
       1.首先调用ValidateMyParameters验证或者初始化你的全局参数。
       2.然后调用ReadScriptingParameters方法读取参数,并写入你的全局参数数据结构。

(3.2)filterSelectorPrepare调用:
        该调用允许你的插件模块调节ps的内存分配算法。“最近一次滤镜”命令将从这个调用开始。PS将maxSpace(这是属于FilterRecord结构(第二个参数)的成员,此后出现的新成员将不再做特殊说明)设置为他能为插件分配的最大字节数。
         imageSize, planes 以及 filterRect 成员:
         这几个成员现在(指sdk 6.0)已经定义,可以用于计算你的内存需求量。imageSize,图像尺寸。planes,通道数。
         filterRect:滤镜矩形。
         这里我再强调一下这个filterRect,它是PS定义的Rect类型(和windows api的RECT结构类似)。这个概念也就是我在《置换滤镜原理》的研究一贴中提到的和反复强调的“选区外接矩形”的概念,在当时我还没有接触到ps sdk。这里我们看到,在Photoshop的代码中,它被称为filterRect。
         bufferSpace:
         如果滤镜想分配超过32K的空间,那么应该设置这个成员为你想申请的字节数。ps会尝试在下一个调用(start调用)前释放这样大小的空间,以保证你的下次调用成功。

(3.3)filterSelectorStart调用:
          该调用中,应该验证参数数据块,根据ps传递来的参数,去更新你自己参数,如果需要显示你的UI。然后进入你的数据处理流程。
          advanceState 回调:(用于请求PS更新相应的数据)
          这是一个PS提供给滤镜的非常重要的回调函数,它的定义如下:
           #define MACPASCAL
           typedef short OSErr;
           typedef MACPASCAL OSErr (*AdvanceStateProc) (void);
          他的作用是要求PS立即更新FilterRecord中的过时数据。例如我们可以设置我们新的处理矩形,然后调用该函数,就可以在此调用后得到我们需要的新的数据。如果你使用这个回调,那么你的核心处理可以全部在start调用中完成,而无需使用continue调用。当处理完成后,可以设inRect=outRect=maskRect=NULL.
如果你不使用这个回调,那么你应该设置第一个矩形区域,然后使用continue调用循环处理。
        例如我们可以在start调用是使用下面的循环来贴片处理图像,直到整个图像处理结束。

advanceState回调示例
<!–

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.php.cn/

–>for(对Photoshop第三方滤镜插件开发的简介对Photoshop第三方滤镜插件开发的简介
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.php.cn/

–>sum=0;
//依次处理每个通道
for(k=0;kg_Planes;k++)
{
    //blur it!
    sum+=bufferPixels[(j-1)*rowBytes+(i-1)*g_Planes +k];
    sum+=bufferPixels[(j-1)*rowBytes+(i)*g_Planes +k]*2;
    sum+=bufferPixels[(j-1)*rowBytes+(i+1)*g_Planes +k];
    sum+=bufferPixels[j*rowBytes+(i-1)*g_Planes +k]*2;
    sum+=bufferPixels[j*rowBytes+i*g_Planes +k]*4;
    sum+=bufferPixels[j*rowBytes+(i+1)*g_Planes +k]*2;
    sum+=bufferPixels[(j+1)*rowBytes+(i-1)*g_Planes +k];
    sum+=bufferPixels[(j+1)*rowBytes+(i)*g_Planes +k]*2;
    sum+=bufferPixels[(j+1)*rowBytes+(i+1)*g_Planes +k];
    sum=sum>>4;//即除以16
    pixels[j*rowBytes+(i)*g_Planes +k]=sum;
}

(五)结束语:
      最后,让我们看一下滤镜使用中的效果截图:在PS启动时,它将扫描各插件目录下的插件,并加载到相应菜单。
      对Photoshop第三方滤镜插件开发的简介
       处理结果:
        对Photoshop第三方滤镜插件开发的简介
       最后是这个滤镜的一个压缩包的下载链接:
       RainDropFilter.rar
       安装方法是,将文件解压,放到Photoshop的滤镜安装目录即可,例如对于Photoshop CS,它的滤镜安装目录可能形如:
       “C:\Program Files\Adobe\Photoshop CS\增效工具\滤镜\”
       有关PS SDK,可以从Adobe官方获取,目前是否是免费的我不清楚了。。。。。

(六)参考资料:
(1)Photoshop SDK 6.0。
(2)Photoshop SDK CS。
(3)(雨滴滤镜的算法)Filter: Raindrops :http://www.php.cn/

—————————————————————————-
 附录:Adobe SDK的声明!
—————————————————————————-
// ADOBE SYSTEMS INCORPORATED
// Copyright  1993 – 2002 Adobe Systems Incorporated
// All Rights Reserved
//
// ADOBE系统 公司
// 版权 1993 – 2002 Adobe公司
// 保留所有权利。
//
// NOTICE:  Adobe permits you to use, modify, and distribute this
// file in accordance with the terms of the Adobe license agreement
// accompanying it.  If you have received this file from a source
// other than Adobe, then your use, modification, or distribution
// of it requires the prior written permission of Adobe.
//
// 注意:Adobe允许你在遵守相应Adobe许可协议条款的条件下,使用,修改,和分发这个文件。
// 如果你从非Adobe方获得该文件,则你使用,修改和分发需要此前签署的Adobe许可协议。
//——————————————————————————-

更多对Photoshop第三方滤镜插件开发的简介相关文章请关注PHP中文网!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3131346.html

(0)
上一篇 2025年3月30日 05:47:31
下一篇 2025年3月8日 00:07:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 用Photoshop制作漂亮的网格点背景

    这篇教程是向【创想鸟】的朋友分享用photoshop定义图案制作漂亮的网格点背景方法,教程真的很不错,制作出来的效果非常漂亮,一起来看看吧 用Photoshop定义图案制作网格点背景的小方法介绍,一起来看看吧! 步骤 “文件”-“新建”,新…

    2025年3月12日 编程技术
    400
  • Photoshop打造一个简洁漂亮的语音图标实例教程

    教程介绍如何快速临摹一个图标,思路:先认真分析图标的构成,尤其是一些细节的构造,然后分析一遍各个部分的大致实现方法;最后就是新建文件,从底层开始制作即可。下面一起跟小编来看看教程吧! 最终效果 这个是原图: 1、下面开始我的制作过程。为了后…

    2025年3月12日 编程技术
    400
  • PhotoShop制作复古风格的邮票

    这篇教程是向脚本之家的朋友分享photoshop制作复古风格的邮票方法,教程制作出来的效果非常漂亮,难度不是很大,值得大家学习,好了,一起来看看吧 现在非常流行复古风格的绘画,用PS制作邮票效果也有很多种方法,我们在各种装饰画和无框画中经常…

    2025年3月12日 编程技术
    400
  • 用Photoshop画直线的3种方法介绍

    这篇教程是向脚本之家的朋友介绍用photoshop画直线的3种方法,教程比较基础,适合新手来学习,推荐到脚本之家,来看看吧 如何用Photoshop画直线呢?小编这就与您分享3种简单易学的方法!小编用的是Photoshop7.0,其它版本的…

    2025年3月12日 编程技术
    400
  • Photoshop钢笔工具绘制立体风格的饮料瓶造型

    这篇教程是向脚本之家的朋友介绍photoshop钢笔工具绘制立体风格的饮料瓶造型方法,教程比较基础,推荐到脚本之家,一起来看看吧 这篇教程向脚本之家Photoshop钢笔工具绘制立体风格的饮料瓶造型方法,教程很不错,以后来学习吧! 设计思路…

    2025年3月12日 编程技术
    400
  • Photoshop设计时尚的欧式酒品杂志广告

    这篇教程是向脚本之家的朋友分享photoshop设计时尚的欧式酒品杂志广告教程,教程制作出来的广告非常不错,方法也不是很难,来看看吧 在本实例制作的是Photoshop设计时尚的欧式酒品杂志广告。主色调是蓝色,配合蓝色线条和水花,体现伏加特…

    2025年3月12日 编程技术
    400
  • Photoshop设计简约风格的节约用水环保公益海报

    这篇教程是向脚本之家的朋友分享photoshop设计简约风格的节约用水环保公益海报教程,教程设计出来的海报非常不错,难度不是很大,值得大家学习,一起来看看吧 今天小编为大家分享Photoshop设计简约风格的节约用水环保公益海报,在本实例中…

    2025年3月12日 编程技术
    200
  • 利用Photoshop制作出在地面写字的效果

    这篇教程是向【创想鸟】的朋友分享利用photoshop制作出在地面写字的效果方法,教程真的很不错,值得大家学习,推荐过来,一起来学习吧 是不是想在地面上写个字告白,现在就为大家分享利用Photoshop制作出在地面写字的效果方法,一起来看看…

    2025年3月12日 编程技术
    200
  • Photoshop设计创意拖影效果的红魔曼联主题壁纸

    这篇教程是向脚本之家的朋友分享photoshop设计创意拖影效果的红魔曼联主题壁纸方法,教程制作出来的效果非常炫酷,难度一般,推荐过来,一起来学习吧 我们先来看一下这张壁纸的最终效果吧,球员选择的是曼联妖星安东尼·马夏尔。 附件里的压缩包是…

    2025年3月12日 编程技术
    400
  • photoshop制作漂亮的非主流效果

    这篇教程是向脚本之家的朋友介绍photoshop制作漂亮的非主流效果方法,教程制作出来的效果非常不错,难度很简单的,喜欢的朋友可以过来参考一下哦今天和大家分享一下如何用photoshop制作非主流效果,方法很简单的,喜欢的朋友快快来学习吧。…

    2025年3月12日 编程技术
    200

发表回复

登录后才能评论