首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Photoshop 插件開發:選區 Selection Plug-in 實作全記錄

     編輯:關於VC++

專案背景:美術素材以「大圖集」形式儲存,數百個小圖位置座標記錄於 XML。每次介面調整,所有小圖座標皆變動,手動在 Photoshop 逐一框選、記錄座標、寫入 XML 極其痛苦。決心開發 PS 選區插件:將座標清單複製到剪貼板 → 執行插件 → 自動在當前文件建立對應選區,徹底自動化流程。

PS 插件架構概覽

  • 插件類型約 9 種,常見:Filter (濾鏡, .8bf)、Select (選區, .8bs)、Export、Import、Automation 等。
  • 安裝:置於 Plug-Ins\Select\ 目錄,副檔名 .8bs,PS 啟動自動掃描載入。
  • SDK:官方已停止免費下載,但早期版本 (PS 6.0 SDK) 仍可在網路取得,開發的插件相容至 CS2/CC 新版本。

選區插件入口函數


void PluginMain(const short selector,
                PISelectionParams* selectionParamBlock,
                long* data, short* result);
  • selector:呼叫目的。selectionSelectorAbout 顯示關於對話框;selectionSelectorExecute 執行選區操作。
  • selectionParamBlock:龐大結構指標,含文件資訊、選區狀態、讀寫埠、記憶體配置函數等。
  • data / result:輸出參數,儲存全域資料控制代碼、回傳錯誤碼。

核心流程:DoExecute → ApplyChannel

SDK 範例 Selectorama 展示標準流程:

  1. AllocateGlobals 封裝 selectionParamBlock 為 Globals 結構。
  2. 呼叫 DoExecute(globals)。
  3. DoExecute 內:
    • 讀取剪貼板自訂格式座標資料 → 全域陣列 g_rcArr[]、計數 g_rcCount。
    • ReadFromWritePort 取得讀取埠。
    • 配置三組緩衝區:sBuffer(來源像素)、dBuffer(選區輸出)、rBuffer(暫存)。
    • AccountChannel 統計需處理通道 (通常 RGB 三通道)。
    • 逐通道呼叫 ApplyChannel 執行實際像素處理。

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") 讀取。

編譯與部署要點

  • 專案類型:Win32 DLL,匯出 PluginMain (無裝飾名,.def 檔或 extern "C")。
  • 包含 SDK 標頭:PISelection.h, PIUtilities.h, SPBasic.h 等。
  • 連結 kernel32.lib, user32.lib, gdi32.lib,SDK 提供的 PIUITypes.lib 等。
  • 輸出檔重命名為 MySelector.8bs,置於 Photoshop\Plug-Ins\Select\。
  • PS 重啟後,「選取」選單底部出現「My Selector」項目。

除錯技巧

  • Visual Studio 專案屬性 → 偵錯 → 命令:設定 Photoshop.exe 完整路徑。
  • 啟動偵錯自動載入 PS,在插件選單點擊即可中斷點除錯。
  • OutputDebugString / printf 輸出至 VS 輸出視窗。

擴充應用:批次匯出、自動化流程

同樣架構可擴充為:

  • Export 插件 (.8be):依選區名稱自動匯出 PNG、切圖、命名規則。
  • Automation 插件 (.8li):搭配 JSX 腳本,實現「一鍵:讀 XML → 建選區 → 匯出 → 更新 XML」完整管線。

總結

選區插件開發核心在於 ApplyChannel 中對 dBuffer 寫入 255/0 對應選區遮罩。配合剪貼板傳遞座標資料,將「手動框選 → 記座標 → 寫 XML」數小時工作壓縮為「複製座標 → 執行插件」數秒。完整原始碼含 PluginMain、DoExecute、ApplyChannel、剪貼板讀取、區塊處理邏輯,可直接修改擴充。若需支援多語系、大文件 (>2GB)、非矩形選區 (路徑)、羽化邊緣,需進一步擴充 PISelectionParams 進階欄位應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved