專案背景:美術素材以「大圖集」形式儲存,數百個小圖位置座標記錄於 XML。每次介面調整,所有小圖座標皆變動,手動在 Photoshop 逐一框選、記錄座標、寫入 XML 極其痛苦。決心開發 PS 選區插件:將座標清單複製到剪貼板 → 執行插件 → 自動在當前文件建立對應選區,徹底自動化流程。
Plug-Ins\Select\ 目錄,副檔名 .8bs,PS 啟動自動掃描載入。
void PluginMain(const short selector,
PISelectionParams* selectionParamBlock,
long* data, short* result);
selector:呼叫目的。selectionSelectorAbout 顯示關於對話框;selectionSelectorExecute 執行選區操作。selectionParamBlock:龐大結構指標,含文件資訊、選區狀態、讀寫埠、記憶體配置函數等。data / result:輸出參數,儲存全域資料控制代碼、回傳錯誤碼。SDK 範例 Selectorama 展示標準流程:
AllocateGlobals 封裝 selectionParamBlock 為 Globals 結構。DoExecute(globals)。DoExecute 內:
g_rcArr[]、計數 g_rcCount。ReadFromWritePort 取得讀取埠。sBuffer(來源像素)、dBuffer(選區輸出)、rBuffer(暫存)。AccountChannel 統計需處理通道 (通常 RGB 三通道)。ApplyChannel 執行實際像素處理。為應對大圖,採 64×64 區塊分塊讀寫:
for (row = limit.top; row < limit.bottom; row += 64)
for (col = limit.left; col < limit.right; col += 64) {
ReadPixels(sourcePort, &area, sDesc); // 讀入來源像素 → sDesc->data
ReadPixels(destReadPort, &area, dDesc); // 讀入現有選區 (可選)
BYTE* s = (BYTE*)sDesc->data;
BYTE* d = (BYTE*)dDesc->data; // 輸出選區緩衝
for (row2 = 0; row2 < 64; ++row2)
for (col2 = 0; col2 < 64; ++col2) {
int x = col + col2, y = row + row2;
bool inSelection = false;
for (int i = 0; i < g_rcCount; ++i)
if (PtInRect(&g_rcArr[i], x, y)) { inSelection = true; break; }
*d = inSelection ? 255 : 0; // 選區內=255(不透明),外=0(透明)
++s; ++d;
}
WritePixels(destPort, &area, dDesc); // 寫回選區
}
關鍵點:
dBuffer 對應選區 Alpha 通道,255 = 完全選取,0 = 未選取。*d = *s 產生「魔棒」漸層選區效果,本專案需精確矩形選區,故直接寫 255/0。RECT 陣列序列化,含計數與座標。外部工具 (或巨集腳本) 先將座標清單序列化至剪貼板:
struct ClipboardSelectionData {
int count; // 矩形數量
RECT rects[256]; // 座標陣列 (左、上、右、下)
};
插件啟動時 OpenClipboard → GetClipboardData(CF_OWNERDISPLAY) 或自訂格式 RegisterClipboardFormat("MySelectionFormat") 讀取。
PluginMain (無裝飾名,.def 檔或 extern "C")。PISelection.h, PIUtilities.h, SPBasic.h 等。kernel32.lib, user32.lib, gdi32.lib,SDK 提供的 PIUITypes.lib 等。MySelector.8bs,置於 Photoshop\Plug-Ins\Select\。Photoshop.exe 完整路徑。OutputDebugString / printf 輸出至 VS 輸出視窗。同樣架構可擴充為:
選區插件開發核心在於 ApplyChannel 中對 dBuffer 寫入 255/0 對應選區遮罩。配合剪貼板傳遞座標資料,將「手動框選 → 記座標 → 寫 XML」數小時工作壓縮為「複製座標 → 執行插件」數秒。完整原始碼含 PluginMain、DoExecute、ApplyChannel、剪貼板讀取、區塊處理邏輯,可直接修改擴充。若需支援多語系、大文件 (>2GB)、非矩形選區 (路徑)、羽化邊緣,需進一步擴充 PISelectionParams 進階欄位應用。