>웹 프론트엔드 >PS 튜토리얼 >포토샵 필터 개발 소개--포토샵 콜백 기능

포토샵 필터 개발 소개--포토샵 콜백 기능

高洛峰
高洛峰원래의
2017-02-20 09:34:532199검색

이전 기사에서는 Photoshop 필터 플러그인 개발을 위한 가장 기본적인 개념과 기초 중 일부를 소개했습니다. 추신: 플러그인의 애플리케이션 요구 사항을 충족하기 위해 플러그인에 대한 많은 콜백 기능(또는 서비스)도 제공합니다. 예를 들어 필터는 통화 후 최근 사용자가 설정한 매개변수를 저장하고 이를 다음 통화 또는 UI 표시에 적용할 수 있습니다. 이는 Ps의 콜백 함수를 통해 수행됩니다. 이 문서에서는 가장 중요한 PS 콜백 함수 중 일부를 설명합니다. 이 기사를 이해한 후에는 콜백 함수를 사용하여 필터 매개변수 저장과 같은 필요한 작업을 완료할 수 있습니다. 이 기사는 첫 번째 기사보다 훨씬 더 복잡하고 심층적이지만 동시에 이 기사에서 PS의 내부 비밀, 즉 신중한 시스템 설계, 완벽한 인터페이스 및 복잡한 작업 메커니즘을 엿볼 수도 있습니다.

(1) 콜백 함수 분류:
Ps 콜백 함수는 위치에 따라 두 가지로 나눌 수 있습니다.
(1) 직접 콜백: (직접 호출 가능) 콜백 함수)
이러한 콜백 함수는 FilterRecord의 직접 멤버이며 FilterRecord 매개변수에서 직접 얻을 수 있습니다. 예를 들어 AdvanceStateProc(데이터 업데이트), TestAbortProc(테스트 사용자 취소) 등이 이 범주에 속합니다.
(2) 콜백 스위트(Callback Suite): (콜백 함수 집합)
콜백 함수를 기능별로 분류하여 제공하는 콜백 함수 집합은 콜백 함수 집합을 가리키는 포인터이다. 콜백 함수의 구조(struct)는 FilterRecord에서 특정 콜백 함수 세트를 가져온 다음 그 안에서 함수를 호출할 수 있습니다.

현재 제공되는 주요 콜백 함수 세트는 다음과 같습니다.
버퍼 제품군: 캐시 메모리 관리(캐시 공간 적용 및 해제).
UI Hook Suite: UI 작업과 관련된 기능 집합입니다.
채널 포트 제품군: 채널 포트 읽기 및 쓰기, PS 내부의 실제 선택 데이터를 읽고 쓰는 데 사용됩니다! 카피라기보다는.
                                                                                                           >                                                   . Color Space Suite: 색 공간 서비스(색상 변환 등).
핸들 스위트: 핸들 관리(버퍼 스위트와 유사한 PS 캡슐화된 핸들 및 메모리 관리).
오류 제품군: 오류 메시지를 수신하고 사용자에게 표시합니다(다양한 유형의 오류 메시지 문자열 수신).
GetFileList Suite: 파일 목록을 가져옵니다(파일 가져오기, 브라우저를 호출하여 웹 탐색 등).
GetPath Suite: 경로를 가져옵니다.
ZString Suite: 문자열 처리를 캡슐화합니다.

예를 들어 UI Hook Suite는 UI와 관련된 콜백 함수 세트를 제공합니다. 첫 번째 버전은 다음과 같이 정의되었습니다.

UI Hooks Suite 버전1
#define kPSUIHooksSuiteVersion1 1  // 제품군 버전
typedef
struct
{
ProcessEventProc processEvent;
DisplayPixelsProc displayPixels;
ProgressProc ProgressBar;
TestAbort Proc testAbort;
MainAppWindowProc MainAppWindow;
HostSetCursorProc SetCursor;
HostTickCountProc TickCount;
PluginNameProc GetPluginName;
} PSUIHooksSuite1;


일부 콜백 함수는 직접 콜백이며 제품군에 저장됩니다. testAbout 및 displayPixels로. 초기에는 이러한 함수 포인터가 FilterRecord에 추가되었으나 업그레이드를 하면서 점점 더 많은 콜백 함수가 추가되고 이로 인해 FilterRecord가 지속적으로 업그레이드되고 멤버가 추가되어 유지 관리가 어려워지므로 Adobe에서 콜백 함수를 추가하기 시작했다고 추측합니다. Classification은 여러 개의 Suite로 나누어져 있으며, FilterRecord에는 해당 Suite만 배치됩니다. 이렇게 하면 함수를 추가할 때 FilterRecord에 영향을 주지 않고 해당 Suite에 추가하고 Suite를 업그레이드하기만 하면 됩니다. 이런 식으로 일부 초기 콜백 함수는 FilterRecord와 자신이 속한 제품군 두 곳에 동시에 위치하므로 직접 호출하거나 해당 제품군을 통해 호출할 수 있습니다.

(2) Suite PEA (플러그인 기능 세트 관리 모듈(레이어), 번역한 이름은 논의 대상입니다)
Suite PEA는 플러그인 시스템으로 사용되는 일부 Adobe 시리즈 소프트웨어에서는 호스트 프로그램에 대한 공통 플러그인 관리 코어 레이어와 플러그인에 대한 표준 인터페이스를 제공합니다.
직접 호출과 약간 다른 점은 사용하기 전에 기능 세트를 획득(Acquired)해야 하고, 사용 후에는 제품군을 해제(release)해야 한다는 것입니다.
획득된 함수 집합은 본질적으로 함수 포인터 집합을 포함하는 구조체를 가리키는 구조체 포인터이므로 함수를 호출할 때 형식은 다음과 같습니다.
sSuite->function( );
따라서 콜백 함수 집합에서 함수를 호출하는 방법은 다음과 같습니다.

제품군
ADMBasicSuite *sADMBasic;

//获取ADMBasic Suite:
filterParamBlock->sSPBasic->AcquireSuite(

//
调사용

sADMBasic->삐( );
//释放

filterParamBlock->sSPBasic
->
ReleaseSuite(              kADMBasicSuite,              kADMBasicSuiteVersion );


(3) 더 중요한 콜백 함수 소개

다음으로 더 중요하다고 생각되는 콜백 함수를 몇 가지 소개하겠습니다. 필터 플러그인. 콜백 함수의 위치와 사용법을 간략하게 소개합니다.
3.1 DisplayPixelsProc( )
기능: 지정된 DC의 지정된 위치에 픽셀 데이터(그림 그리기)를 출력합니다. (물론 실제로 이 기능을 직접 완성할 수도 있습니다.)
위치: Direct Callback, UI Hook Suite;
정의:
OSErr (*DisplayPixelsProc) (const PSPixelMap *source ,
const VRect *srcRect, int32 dstRow, int32 dstCol,
                              다음과 같이 정의되는 포인터:

PSPixelMap Struct Define

Actipro CodeHighlighter(프리웨어)에서 제작한 코드 강조 표시
http:// www.php.cn/
typedef

structPSPixelMap{ int32 버전; 
/ /
버전 번호  VRect 경계;
int32 imageMode; /스캔 선 너비 int32 colBytes 🎜>
int32 planeBytes ; >공허 *
baseAddr >
//---------- ---------// 생략
..
} PSPixelMap; srcRect: 원본 직사각형(원본 이미지의 복사 범위)
dstRow, dstCol: 대상 시작점 좌표(왼쪽 위 모서리), 늘어나거나 그려지지 않기 때문에 왼쪽 위 모서리의 좌표만 있으면 충분합니다.
          platformContext: Windows 시스템에서, 즉 장치 컨텍스트(DC)

3.2 설명자 모음(설명자 함수 집합)
디스크립터 세트는 주로 PS의 스크립트 시스템에 사용되며 PS에서 일련의 작업 중에 필요한 정보와 매개 변수를 기록(기록)하는 데 사용되며 재생할 수 있습니다. 이는 "읽기"와 "쓰기"라는 두 가지 하위 기능 세트로 나뉩니다. 이 기능 세트를 사용하여 PS의 스크립팅 시스템이 필터를 "인식"하고 이를 동작 시퀀스에 기록하도록 할 수 있습니다.
이를 얻는 방법은 먼저 FilterRecord를 통해 PIDescriptorParameters를 얻는 것입니다:

PIDescriptorParameters Struct Define
typedef struct PIDescriptorParameters
{
int16 descriptorParametersVersion;
작업 재생 플래그: 0-대화 상자 필수, 2-대화 상자 없음; RecordInfo //작업 기록 플래그: 0 - 대화 상자가 표시되지 않음, 2 - 대화 상자가 표시됨
PIDescriptorHandle 설명자; //설명자의 핸들은 매우 중요합니다. 우리는 이를 사용하여 데이터를 읽고 씁니다!
WriteDescriptorProcs* writeDescriptorProcs;
//
"write" sub- 함수 설정 ReadDescriptorProcs
*
readDescriptorProcs; //"read" 하위 함수 세트} PIDescriptorParameters;
그런 다음 "읽기" 또는 "쓰기" 하위 기능 세트를 얻을 수 있습니다.

"읽기" 및 "쓰기" 하위 제품군 가져오기
//설명자 매개변수 구조 가져오기 :
PIDescriptorParameters* descParams = gFilterRecord- >descriptorParameters;
if (descParams == NULL) return err;

//"읽기" 하위 기능 세트 가져오기:
ReadDescriptorProcs* readProcs = gFilterRecord-> descriptorParameters ->readDescriptorProcs;
if (readProcs == NULL) return err;

//"쓰기" 하위 기능 세트 가져오기:
WriteDescriptorProcs* writeProcs = gFilterRecord-> descriptorParameters->writeDescriptorProcs;
if (writeProcs == NULL) 반환 err;


두 개의 하위 기능 세트를 얻은 후에는 해당 하위 기능 세트 아래의 기능을 호출하여 매개변수를 "읽고" "쓸" 수 있습니다. 두 하위 기능 세트의 사용은 레지스트리 작업과 유사합니다. 읽고 쓰기 전에 먼저 해당 설명자를 열어야 합니다. 따라서 먼저 열기 및 닫기 설명자 작업을 소개합니다.
                                                                            매개변수 설명: PIDescriptorHandle: 설명자 핸들, 이를 사용하여 레지스트리 키와 유사하게 후속 작업에서 데이터를 읽고 씁니다. DescriptorKeyIDArray:
쿼리해야 하는 키 컬렉션을 저장하는 uint32 배열입니다. 관련 정의는 다음과 같습니다. orKeyIDArray[];




배열의 요소는 필요한 키 이름, 즉 쿼리하려는 매개변수 이름입니다. 쿼리하려는 키. int32 유형이므로 각 키는 4자로 표시되는 ASCII 코드를 보유할 수 있습니다. 4바이트 미만인 경우 공백으로 채워질 수 있습니다. 예를 들어, 이 매개변수 할당을 설정하면 {'Pam1','Pam2',NULL}이 설정될 수 있으며, 이는 'Pam1' 및 'Pam2'라는 두 개의 매개변수를 쿼리해야 함을 의미합니다. 예를 들어 스크립트 시스템에서 Gaussian Blur(
GaussianBlur
) 필터의 핵심은 'GsnB'입니다. 각 키 값은 GetKeyProc()을 호출하여 얻습니다. 값이 반환될 때마다 이 문자열 배열의 해당 키는 비어 있는 상태로 설정됩니다('이 함수는 쓰기 설명자를 닫고 새 설명자 핸들을 생성하여 호스트 프로그램에 반환하려면 PIDescriptorParameteres로 설정해야 합니다. 여기서 함수의 동작은 GDI 작업의 SelectObject와 다소 유사합니다. GDI 작업에서 장치 컨텍스트에 새 속성을 설정하면 사용자가 백업할 것으로 예상하여 기존 속성을 반환합니다.

                                                                                     ~ 여기서는 일반적인 형태만 소개하고 필요한 경우 따로 설명하겠습니다. 대부분은 상대적으로 표준화된 특성을 가지고 있습니다(일부 함수에는 예외 형식이 있으며 나중에 별도로 소개하겠습니다). 즉, 읽기는 Get으로 시작하고 쓰기는 Put으로 시작합니다. 매개변수는 쿼리 결과를 수신하는 데(또는 작성된 데이터를 저장하는 데) 사용되는 해당 유형의 데이터 포인터입니다. 쿼리해야 하는 데이터 유형이 TypeName이라고 가정하면 다음과 같습니다. 🎜>TypeName *
dest) //Read

OSErr(*
Put
TypeNameProc) (PIWriteDescriptor 설명자, DescriptorKeyID, TypeName *dest); //쓰기:                           ~                                                                         ):
설명자 읽기 하위 제품군Actipro CodeHighlighter(프리웨어)에서 생성된 코드 강조 표시http:// www.php .cn/-->//
하위 기능 집합 멤버 읽기

typedef
//하위 기능 집합 멤버를 작성합니다. 형식은 이전 기능과 유사하지만 추가로 키를 제공해야 합니다
typedef struct WriteDescriptorProcs
{
int16 writeDescriptorProcsVersion;
int16 numWriteDescriptorProcs;
OpenWriteDescriptorProc openWriteDe 스크립트 또는Proc;
CloseWriteDescriptorProc closeWriteDescriptorProc;
PutIntegerProc putIntegerProc;
PutFloatProc putFloatProc;
PutUnitFloatProc putUnitFloatProc;
PutBooleanProc putBooleanProc;
PutTextProc putT extProc;
Put AliasProc putAliasProc;
PutEnumeratedProc putEnumeratedProc;
PutClassProc putClassProc;
PutSimpleReferenceProc putSimpleReferenceProc;
PutObjectProc putObjectProc;
PutCountProc putCountProc;
PutStringProc putStringProc;
/* Photoshop 4.0의 플러그인에서 사용 */
PutScopedClassProc putScopedClassProc;
PutScopedObjectProc putScopedObjectProc;
} WriteDescriptorProcs;


매개변수 읽기 및 쓰기의 예:
스크립트 시스템에서 매개변수 읽기: 매개변수의 키가 'Pam1'이라고 가정하고 이를 수신하기 위해 임시 변수 param1을 사용합니다.

매개변수 데모 코드 읽기
PIReadDescriptor 토큰 = NULL //읽기 연산자
DescriptorKeyID 키 = NULL //uint32, 즉, char*, 키 이름
DescriptorTypeID 유형 = NULL // 설명자 유형
int32 플래그 = 0// 식별
DescriptorKeyIDArray 배열
= { 'Pam1', NULL }; //조회할 키 설정
double param1; //읽고자 하는 매개변수
//
설명자 매개변수 구조 가져오기
PIDescriptorParameters
* descParams = gFilterRecord->descriptorParameters;                                  
NULL)
return 오류; //Descriptor Suite Set에서 "읽기" 하위 기능 가져오기
ReadDescriptorProcs* readProcs
=
gFilterRecord->descriptorParameters->readDescriptorProcs; 🎜>== NULL) return err;
if (descParams->설명자 != NULL)
{
//"읽기" 설명자 열기
토큰 = readProcs->openReadDescriptorProc(descParams->설명자, 배열);
 
if (토큰 != NULL)
                                         
 그동안
(readProcs->getKeyProc(token, &key, &유형, &플래그) && !err)                                        🎜>               케이스

팸 1
':

/ /
매개변수 읽기                                              > param1);   휴식;                                                                      >기본값:                                                                         > ;
}
} }//읽기 설명자 닫기
            오류 = readProcs->closeReadDescriptorProc(token);
            
//释放描述符
            gFilterRecord->handleProcs- >disposeProc(descParams->설명자);
            descParams
->설명자 = NULL;
        }
   }

스크립트 시스템에 매개변수 쓰기: 위의 ​​예와 동일:

설명자 데모 코드 쓰기
OSErr 오류 = noErr;
PIWriteDescriptor 토큰
= NULL;
PIDescriptorHandle h;
const
double param1 = 1.05;

PIDescriptorParameters
* descParams = gFilterRecord -> >반환
err;
WriteDescriptorProcs* writeProcs = gFilterRecord->

descriptorParameters
->writeDescriptorProcs; 🎜>== NULL) return err; 토큰 =
writeProcs-> openWriteDescriptorProc();if (토큰 !=

NULL)
{ //매개변수 쓰기~ writeProcs->putFloatProc(token,'Pam1',
&
param1); //해제 설명자 gFilterRecord->

handleProcs
->disposeProc(descParams ->설명자); //"읽기" 설명자 닫기
writeProcs
->
closeWriteDescriptorProc( token, &h); //새 설명자를 Photoshop으로 반환 descParams->설명자
=
h; }

3.3 DescriptorRegistry suite: (디스크립터 등록 기능 세트)
디스크립터 등록 기능 세트는 주로 디스크립터 등록 및 획득에 사용됩니다. 이를 통해 필터가 여러 번 호출되는 동안 매개변수를 저장하도록 ps에 위임할 수 있습니다. 여기에는 등록, 제거 및 키 획득을 위한 여러 주요 기능이 포함되어 있습니다.
Register()
 설명: 키를 등록합니다.
정의:
OSErr(*등록) (
/* IN */ const char* key, // 고유 문자열 또는 ID
        /* IN */ PIActionDescriptor 설명자, // 설명 문장 핸들
/ * in */Boolean Ispersicious // 저장 및 복원을 PS 유지 관리에 맡길지 여부
)

Erase ()
설명: 키 제거
정의:
OSErr (*Erase)
(
/* IN */ const char* key // 고유 문자열 또는 ID
);
설명: 키를 반환합니다. 반환된 설명자는 복사본이므로 사용 후 적극적으로 해제해야 합니다.
정의: OSErr(*Get)
(
/* IN */ const char* 키, // 고유 문자열 또는 ID
                                                               




3.4 ActionDescriptor 제품군: (액션 설명자 함수 세트)

Action Descriptor 함수 세트, 는 키를 저장하는 데 사용됩니다( 또는 객체)를 설명자로 변환하고 설명자 및 기타 설명자 관리에서 읽습니다. 이 기능 세트에는 읽기 및 쓰기 기능이 모두 포함되어 있으며 사용 방법은 이전 섹션의 설명과 유사합니다. 이는 다음과 같이 정의됩니다:
PSActionDescriptorProcs Struct

Actipro CodeHighlighter(프리웨어)에서 생성된 코드 강조 표시http:/ / www.php.cn/
-->//매개변수 작성 및 등록
SPErr WriteRegistryParameters(void)
{
SPErr err
= noErr;
//다른 제품군을 구입하기 위한 기반이 되는 SPBasicSuite 구입
SPBasicSuite* basicSuite = gFilterRecord->sSPBasic;
 
// 설명자 등록 함수 집합 포인터
PSDescriptorRegistryProcs* RegistryProcs = NULL;
//설명자 함수 설정 포인터
PSActionDescriptorProcs* descriptorProcs = NULL;
PIActionDescriptor 설명자 = NULL;
//매개변수
 double param1
=0.1; //설명자 등록 기능 세트 가져오기

오류 = basicSuite
->AcquireSuite(kPSDescriptorRegistrySuite,                                            ( const void

**)&registryProcs) ;//액션 설명자 함수 세트 가져오기
오류 = basicSuite ->AcquireSuite(kPSActionDescriptorSuite,
                                       (
const 무효 **)&descriptorProcs); 🎜>
=
descriptorProcs->Make(&설명자); //매개변수 작성
오류
=
descriptorProcs->PutFloat(descriptor, 'Pam1 ',param1); //지정된 ID의 설명자를 등록합니다
err = RegistryProcs- >Register(plugInUniqueID, descriptor, true);
 
//
릴리스 설명자 
(설명자 != NULL) descriptorProcs->
무료(설명자); //
해제 기능 세트 
if (registryProcs != NULL) basicSuite->
ReleaseSuite(kPSDescriptorRegistrySuite,                                              > 만약 ( descriptorProcs

!=
NULL) basicSuite->ReleaseSuite(kPSActionDescriptorSuite, kPSActionDescriptorSuiteVersion);
반품 err;
}
매개변수 읽기 예:

등록된 매개변수 읽기
//등록된 매개변수 읽기
SPERr ReadRegistryParameters(void)
{
SPErr err
= noErr;
/ /기본 기능 세트인 SPBasicSuite를 받으세요. 이를 통해 다른 기능 세트도 얻을 수 있습니다
SPBasicSuite* basicSuite = gFilterRecord->sSPBasic;
PSDescriptorRegistryProcs
* RegistryProcs= NULL;
PSActionDescriptorProcs
* descriptorProcs = NULL;
PIActionDescriptor 설명자
= NULL;
더블 param1;

//설명자 등록 기능 설정 가져오기
err = basicSuite-> AcquireSuite(kPSDescriptorRegistrySuite,                                                                       (

const
void **)&registryProcs); 

//
액션 설명자 가져오기 함수 세트
오류
= basicSuite->AcquireSuite(kPSActionDescriptorSuite, kPSActionDescriptorSuiteVersion, (

const
void ** )& descriptorProcs);
//지정된 ID의 설명자 가져오기
오류 = RegistryProcs->Get(plugInUniqueID, &descriptor);
//등록된 매개변수 읽기
오류
= descriptorProcs->GetFloat(설명자, ' Pam1',&param1);
 
//릴리스 설명자
 if (설명자 != NULL )
descriptorProcs
->Free(descriptor);
//릴리스 디스크립터 등록 기능 세트
if (registryProcs != NULL)
basicSuite
->ReleaseSuite(kPSDescriptorRegistrySuite,
🎜>
릴리스 작업 설명자 함수 세트

if
(descriptorProcs != NULL) basicSuite->
ReleaseSuite(kPSActionDescriptorSuite,
오류;}

                                                      ~             두 가지 주요 범주로 나뉘며, 하나는 직접 콜백 함수라고 하는 플러그인 매개변수 구조에 직접 포함됩니다. 콜백 함수 세트에 포함됩니다. 직접 콜백 기능의 경우 텍스트에서는 DisplayPixelsProc를 사용하여 장치 DC에서 이미지를 매핑할 수 있다는 점만 설명합니다. 첫 번째 기사에서 언급한 AdvanceStateProc, TestAbortProc, UpdateProgressProc를 포함하여 모두 직접 콜백이며 일부 직접 콜백 함수는 특정 Suite에 속합니다. 콜백 함수 세트(Callback Suite)의 경우 콜백 함수 세트의 Descriptor Suite에서 읽기, 쓰기, 등록 및 기타 작업에 중점을 두었습니다. 이 함수 세트를 사용하면 PS가 필터 매개변수를 작업 시퀀스에 기록할 수 있습니다. 또는 필터 매개변수를 등록하여 여러 호출에서 저장하고 읽을 수 있습니다. 메모리 관리, 색 공간 서비스 및 기타 기능 세트와 같은 기타 콜백 기능 세트는 공간 제한으로 인해 아직 다루지 않았습니다. (--By Hoodlum1980)


Photoshop 필터 개발에 대한 자세한 소개--Photoshop 콜백 기능과 관련된 기사는 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.