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