フォトショップフィルタープラグイン

いつかは倒さねばならないと思っていたのでそろそろ再開。
書きながら作ってるので、いつ行き詰まるやら…。というか、間違いもあるだろうから、鵜呑みにしないでくださいね。何時の間にか書き換わっていたりします。
とりあえず、「白を透明に」なフィルタを作るのが目標。丁度、Photographer->HyperKidで消えてしまった、なんといっても簡単そうだし(笑)。
2002/7/2更新。
  1. 開発環境
  2. 使うサンプル
  3. そのままビルド
  4. 改造準備
  5. おおまかな構造
  6. 改造個所
  7. メモ
  8. 参考ページへのリンク

開発環境

私が持っているコンパイラはVC++5.0。
VC++5.0と各SDKの相性などは以下。結論から言うと、5.5がベスト。基本的に、新しい方がサンプルが読みやすく改良されているので、なるべく新しいものの方が良い。
SDKのバージョンコメント
4.0プロジェクトがVC++4.0用。そのままコンパイルするには色々問題アリ。SDK4.0をVC++5.0で使う場合、色々コツが必要。
5.0プロジェクトがVC++5.0用。悪くないが、5.5の方がサンプルが判り易い。
5.5プロジェクトがVC++5.0用。この代からサンプルのディレクトリ構成が変わる。
6.0プロジェクトがVC++6.0用。VC++5.0でビルドを試みるとリソースの.rファイルの処理でVC++5.0が固まった。MFC使ったサンプルが付いてたような気がする。

ちなみに、6.0を最後にAdobeはSDKの無料ダウンロード止めた模様。フォトショップのCDのオマケにも付いていたけれど、今でも入っているかどうかは不明です。

使うサンプルについて

サンプルはソース自体は「PoorMansTypeTool」が一番判り易い…んだけど、何故かビルドしたフィルタを実際にハイパーキッドで使うとアプリケーションエラーになるので、やっぱりDissolve-sans-AppleScriptを使う(こちらは大丈夫)。

これをハイパーキッドにインストールすると
メニュー
が追加される。画像に色の付いたノイズを吹くフィルタ。ちなみにDissolve-with-AppleScriptも全く同じだが、sansの方が微妙にシンプル。Apple Script対応か否かの差らしい。もちろん、私はHyperKidで使うから対応は無用である。
設定ダイアログ
プレビュー画面だと画面一面にノイズが吹かれるけど、HyperKidで実際に使うと、透明部分にはノイズ乗っていないのが気になる。ソースでは透明度レイヤーにも書きこんでいるように見えるんだが…。

まずはそのままコンパイル

そのままコンパイルすると相変わらず

..\..\..\Common\Includes\PIUtilities.h(58) : fatal error C1083: インクルード ファイルがオープンできません。'Types.h': No such file or directory
が出る。例によって
#include <Types.h>				// Standard types.
	↓
#include <sys/Types.h>				// Standard types.
と修正。ビルドが成功する。

フィルタのDISSOLVESANS.8bfは
〜\Adobe Photoshop 5.5 SDK\SampleCode\Output\Win\Release\
に出来る。

改造準備

とりあえず、Dissolve-sans-AppleScriptを同じ階層のディレクトリにコピーする。
Dissolve-sans-AppleScript2と名前を変える(安直)。

作成されるフィルタプラグインファイル(DISSOLVESANS.8bf)の名前変更

プロジェクト→設定のリンクタブの一般、出力ファイル名を変える。"nekora.8bf"にする。
nekora.exp : warning LNK4070: .EXP 内の /OUT:DISSOLVESANS.8bf ディレクティブの指定が出力ファイル名 "..\..\..\Output\Win\Release\nekora.8bf" と異なっています; ディレクティブは無視されます
というエラーが出るが大丈夫…だと思う…今の所。

リソースの日本語化

Dissolvesans.rcをメモ帳等で開き、
/////////////////////////////////////////////////////////////////////////////
// 英語 (アメリカ) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
を、
/////////////////////////////////////////////////////////////////////////////
// 日本語 resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
#ifdef _WIN32
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)
#endif //_WIN32
に書きかえ、日本語リソースだということにする。

次に、ダイアログのフォントを日本語可のもの変えるべく、その下の方の
FONT 8, "MS Sans Serif"
FONT 8, "MS Pゴシック"
とする。ここでダイアログやボタン等の文字もいじれるけれど、その辺はVisual Studioでやった方が安全でしょう。
あと、一応、プロジェクト→設定のリンクタブのリソース、で設定も日本語にしておいた方が気分的によし。 日本語になったの図キャプションなどを日本語にしてみた。

残った謎:メニューのnoise->Dissolve-sans-AppleScriptの変え方がわからん…。

大まかな構造

フォトショップ本体から、複数回に分けてフィルタDLL内の関数を呼び出している。大体、次のような感じ「らしい」。
タイミング呼び出される関数メモ
メニューからこのフィルタを選択した時DoParameters()設定ダイアログを出す処理
“前回使ったフィルタ”(Ctrl+f)を選択した時 DoPrepare()メモリーとか用意するらしい
上記の後DoStart()スタート
上記の後DoContinue()実行。よくわからない
最後DoFinish()終了処理。パラメータを返す

私がやるべき事としては、DoParameters()で設定ダイアログを出して自分のフィルタ固有のパラメータをユーザに入力させる。で、それを自前でAllocしたメモリに入れ、FileRecordのparameterにそこへのポインタをセットして関数終了。

その後、DoStart()で、先のFileRecord構造体からパラメータ他を取り出し、inDataからピクセルデータを読み、outDataに書き出す、って手順でいいのかな。

改造個所

改造する関数はずばりDoFilterRect().ここで画像を書き換えている。

	unsigned8 *srcPtr = (unsigned8 *) gStuff->inData; // 入力領域
	unsigned8 *dstPtr = (unsigned8 *) gStuff->outData; // 出力領域
	unsigned8 *mskPtr = (unsigned8 *) gStuff->maskData // マスク;
	gStuff->planes; プレーンの数(r,g,b+αチャネル(不定) )
	gStuff->haveMask; // マスクがある=1 無し=0
	const short columns = gStuff->outRect.right - gStuff->outRect.left; // 幅
	const short rows = gStuff->outRect.bottom - gStuff->outRect.top; // 高さ

αチャンネルを使う時は、これを1にするらしい。 Dissolvesans.hの

#define useAlpha 			0		// use alpha
これは違うだろう。

メモ

・HyperKid/Photographerの場合、プラグインを呼ぶ前に予め「表示マスク」を作成しておかないと、プラグインには3プレーンしか渡らない。オカシイ…透明プレーンもあるはずだ。
・DoFilterRect()はいつも4回呼ばれる。何故だろう。←最初の3回は妙に小さいのでプレビューのためくさい。
・衝撃の事実!やっぱ本家Photoshopだと、私の想定通りの動作をする。でもハイパーキッドだと透明部分のデータが反映されない(=透明部分にはフィルタは描画できない?)。ヤル気が無くなったなぁ。
・でも普通に動作するフィルタもある(というか、その方が多い)ので何か方法があるはず。
・つか、ちゃんと動作するサンプルソースさえあれば…。

参考となるサイトへのリンク

  1. Adobe Developers Relation SDKs
    フォトショップのプラグインの開発キット(英語)。最新版しか置いていないのが珠に傷。最近は有料の会員にならないと入手できなくなった模様。 っていうか開発内容の事前審査までするらしい。6.0SDKまでは無料でダウンロードできたんだけど。
  2. PhotoShop のフィルタについて
    SDKのマニュアルの一部が翻訳されてます。はっきり言ってここを読めばこのページは無用な感じ。
  3. Photoshopプラグインフィルター互換ホストの作り方 逆にフィルターを呼び出す時の話。
  4. SDK倶楽部
    Photoshopのプラグイン作成時の注意事項が書かれています。
  5. NewsPrint を Adobe Photoshop plugin に移植してみよう
    フォトショップのフィルタプラグインのVC++ソースを公開されてます。
  6. プログラム講座 上級編2
    ずばり、フォトショップのフィルタの作り方の解説(日本語)。MacintoshのFutureBASICだがとても参考になる。
  7. フォトショッププラグインをつくろう!
    ファイル入出力のフィルタ(フォーマット)の作り方の解説です。
  8. Adobe Photoshop 3.0/4.0形式
    フォトショップのファイルフォーマットの日本語解説
  9. Photoshop 7 SDKなしでMacOS X対応プラグインを作る方法
    Windowsには関係無いけど。

フリーソフトウェアへ戻る
ホームページへ戻る
お手紙はnekora@mapletown.netまで☆