Nanashi-softプログラマ専用Photoshopプラグイン開発


◇Photoshopプラグイン開発 -サンプル解析-

プラグインで一番骨が折れるのが,独自仕様のオンパレードな点です
サンプルを書き換えて作る。というのがセオリーです

今作りたいのは,フィルターで実行すると,RGB値が 16bitカラーになる機能です
なので,フィルターのサンプルをゴニョゴニョすれば良いと思われます

●目的の機能と似たサンプルを探す

filterフォルダの下にあるプロジェクトを見て,分かりやすそうなのを探してみる
dissolveがそれっぽいので,ビルドしてみる

・『エラー    1    error RC1015: cannot open include file 'afxres.h'.    C:\aa\adobe_photoshop_cs5_sdk_win\pluginsdk\samplecode\filter\dissolve\win\Dissolve.rc    10    1    Dissolve』
文字通り afxres.hが開けないエラーだが,そのようなファイルは SDK内には存在しない
なので,作成して置いてやる

○afxres.hファイル
#ifndef _AFXRES_H
#define _AFXRES_H

#ifdef __cplusplus
extern "C" {
#endif

#include <windows.h>
#define IDC_STATIC (-1)

#ifdef __cplusplus
}
#endif

#endif
【注意】パソコン内にあった gccに付属の afxres.hから想像して作成したもので,あくまでコンパイルを通す為だけのものです

これを commonフォルダに突っ込んで,再度ビルドします

正常にビルドが完了すると,以下の場所に生成されました
adobe_photoshop_cs5_sdk_win/pluginsdk/samplecode/Output/Win/Release64/Dissolve.8bf

これを,前回と同様にフォトショのプラグインフォルダに放り込みます

適当に新規作成して,メニューのフィルター→AdobeSDK→Dissolve...
Amount%が全体のどのぐらいの割合に点を描くかを指定
100%として,OKボタンを押すと塗りつぶしになります

つまり,このプラグインを解析すれば,描画する事が可能だということです

●解析する

commonフォルダ内にある .cppファイルは3つです
Dissolve.cpp
DissolveRegistry.cpp
DissolveScripting.cpp

中身をザッと見たところ,Dissolve.cppの DissolveRectangle関数で塗っている事は容易に想像できます

leaveItAloneとdissolveに関するif文を削除すると,常に塗りつぶしになると思うので,やってみる
→確かにそうなった

InitDataの最初で,背景色,青,赤,緑のラジオボタン選択時カラーを代入している様子
だとすると,パレットは 0~255形式で指定と思われる
それを直接代入している DissolveRectangle関数中の……
if (depth == 32)
	*fPixel = fColor;
else if (depth == 16)
	*bigPixel = bigColor;
else {
	*pixel = color;			//←こいつが背景レイヤーと予想
}

後ろ 3bitをカットすれば,目的の 16bit化減色になる(はず)
if (depth == 32)
	*fPixel = fColor;
else if (depth == 16)
	*bigPixel = bigColor;
else {
//	*pixel = color;
	*pixel = *pixel & 0xf8;
}
これを実行してみると,ちゃんと 16bit画像が生成されました
ただし,画像は背景レイヤーでなければなりません(そこしか触っていない為)



TOPプログラマ専用Photoshopプラグイン開発