なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ

書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

2022/09/09

CLIP STUDIO PAINT SDK で任意の座標情報から色情報を取得したい

カテゴリー:C++

CLIP STUDIO PAINT EX ではプラグインが使えるんですが、プラグイン開発するには僅かな公式情報と、数件しかないインターネット上の情報に頼むしかなく、ハードルが高い状態です。
ということで、先陣の方にも倣って、わたしも今回のプラグイン開発で得た知識を放流していこうと思います。

なお、プラグイン SDK は 2021/09/09 時点に更新されている SDK を前提にしており、今後の更新で壊れる可能性があります。

CLIP STUDIO PAINT SDK のドキュメントにもあるとおり、座標情報を伴った色情報の操作については、 BitmapService を使う必要があるのですが、
その使い方についてはドキュメントを探しても記述されていません。
ということで、その使い方について記述しておきます。

まず BitmapService を用いて、 BitmapObject を作成します。
BitmapService は、 ServiceSuite 経由で取得が可能です。

// destinationOffscreenObject は TriglavPlugInFilterRunGetDestinationOffscreen マクロで取得した OffscreenObject

const auto pBitmapService = (*pPluginServer).serviceSuite.bitmapService;

// 作成すべき Bitmap の高さと幅を、既存のキャンバスから持ってくる
TriglavPlugInInt width;
TriglavPlugInInt height;

(*pOffscreenService).getWidthProc(&width, destinationOffscreenObject);
(*pOffscreenService).getHeightProc(&height, destinationOffscreenObject);

// 高さ、幅を元に、 Bitmap を作成
TriglavPlugInBitmapObject sourceBitmapObject = nullptr;
(*pBitmapService).createProc(&sourceBitmapObject, width, height, 3, kTriglavPlugInBitmapScanlineHorizontalLeftTop);

// OffscreenObject から Bitmap に転写
TriglavPlugInPoint bitmapSourcePoint { 0, 0 };
TriglavPlugInPoint offscreenSourcePoint { 0, 0 };

(*pOffscreenService).getBitmapProc(sourceBitmapObject, &bitmapSourcePoint, sourceOffscreenObject, &offscreenSourceObject, width, height, kTriglavPlugInOffscreenCopyModeImage);

ビットマップを取得後、 TriglavPlugInPoint オブジェクトを指定することで、該当部分の色情報が取得できます。
色情報はポインターで帰ってきますが、各インデックスについては getRGBChannelIndexProc で取得可能です。

TriglavPlugInInt rIndex, gIndex, bIndex;
(*pOffscreenService).getRGBChannelIndexProc(&rIndex, &gIndex, &bIndex, sourceOffscreenObject);

最後に、この情報を用いて、 getAddressProc を行います。

const int x = /* 欲しい座標 */;
const int y = /* 欲しい座標 */;

TriglavPlugInPtr address;
TriglavPlugInPoint point = { x, y };
(*pBitmapService).getAddressProc(&address, sourceBitmapObject, &point);

const auto src = static_cast<const BYTE*>(address);
const auto r = src[rIndex];
const auto g = src[gIndex];
const auto b = src[bIndex];

ちなみに、型情報から分かるとおり、上記アドレス + インデックスの値に色情報を投げつけることで、該当部分の色を変えることも可能です。
ということで、メモでした。