亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

VC++開發PhotoShop插件之選區

2019-11-17 05:00:14
字體:
來源:轉載
供稿:網友
  本文轉自vc知識庫,文中內容不代表本站觀點,僅供參考

  我們的程序里用到的圖都是放在一張大圖里的,所以就有一個文件記錄每個小圖是放在這張大圖的什么地方,類似這個樣子:

<name="button" left="10" top="30" right="24" bottom="70"/>.

  圖要是少了還好,多到幾十、幾百個這樣的記錄,每次要更新一個圖都要找半天,尤其是界面大變的時候,幾乎所有的小圖的位置都變了,這樣就要在photoshop里找到每一個小圖,記下它的坐標,然后在寫到配置文件中。要是偶然做做也就忍了,可是這種不幸的事情經常發生,忍無可忍,覺得這種事情計算機應該可以勝任,它能干的事情,我們果斷不能替它干。仔細研究了幾天,總算研究明白了PS的插件機制,可以實現先Ctrl+C一些坐標位置,然后在PS中選中這些區域。
  還是Adobe比較牛,我們辛辛勞苦幫它開發插件,它還要收費。現在的PS插件開發的SDK已經不免費下載了,還好在免費的互聯網上還能找到早期版本的免費SDK,我找到的是6.0的,開發的插件可以在最新的PS CS2中使用。

  據官方文檔聲明,PS大概支持9種插件,比較常見的是Filter,俗稱濾鏡,一般用來實現一些非凡的圖像處理算法,如邊緣提取等,我感愛好的是Select插件,看名字就像是和選區有關。插件的使用很簡單,放到PS安裝目錄下的Plug-Ins目錄下的相應類別下即可,比如濾鏡就放在Plug-Ins/Filters下,擴展名是.8BF,選擇插件放在Plug-Ins/Select下,擴展名為.8BS.PS啟動時會搜索這個目錄。

  PS的SDK帶了很多插件的例子,你可以找你感愛好的那個類別的插件例子看看,然后改改就可以了。我們先看看PS 6.0 SDK 帶的Selection目錄下的Selectorama這個例子。它演示了如何在當前的文檔上選中感愛好的區域,不過例子似乎稍微復雜了點兒。

  PS的Windows下的插件一般是一個標準的dll,入口函數為PluginMain,原型是:

void PluginMain (const short selector,
PISelectionParams *selectionParamBlock,long *data,short *result);

 其中,selector是一個類型參數,說明本次調用的目的是什么,假如是常量"selectionSelectorAbout",說明需要顯示一個關于對話框。在濾鏡插件中,PluginMain會被調用多次,可以根據selector來決定具體做什么操作。
selectionParamBlock 是指向一個龐大的結構的指針,里面幾乎有所有你需要的東西。比如,當前文檔的大小可以通過
  selectionParamBlock->documentInfo->bounds   獲取,假如想知道現在用戶是否選擇了一塊區域,可以通過 selectionParamBlock->documentInfo->selection->bounds 來獲取。

  剩下的兩個都是輸出參數,可以用來存儲句柄,返回錯誤等,暫時可以不用理會。

  在PluginMain函數中,會間接調用DoExecute這個函數,傳遞的參數叫globals,其實是把輸入參數 selectionParamBlock 包裝了一下,真正有用的還是:

globals->selectionParamBlock

  在插件中,假如想從PS里讀數據,需要一個叫做read port的東西,例子中使用了ReadFromWritePort這個宏來獲取一個read port,這個我們暫時可以不用管它,接著向下看,會看到分配了三塊緩沖區:sBuffer,dBuffer,rBuffer,假如transparency不空的話,還會分配一個mBuffer的緩沖區。我實際用到的只是sBuffer和dBuffer,其它兩個高級的東東還沒用到。接下來是調用 AccountChannel 計算需要處理的通道,一般會有R G B 三個通道。然后就是要害的 ApplyChannel 函數來完成實際的工作。

  這個函數的參數很多,不過你只要記住剛才提到的sBuffer和dBuffer就夠了。sBuffer用來保存從當前的圖像中讀來的圖像數據,dBuffer用來保存你的選區信息,和sBuffer一一對應,假如某個象素需要選中,直接賦值為255即可。原例中需要選擇的部分賦值是原來圖像的內容,經過實踐發現這樣會造成魔棒選區的特效,我用不著這個高級功能,所以就直接賦成255了,可以精確的按我的要求工作。在這個函數里,考慮到圖像可能會比較大,一次讀過來可能受不了,所以先用了兩個循環,按64×64的塊大小循環讀取處理,我們就可以再來一次循環,對每個64×64塊的每個象素處理,根據剪貼板里設定的選區信息,判定當前象素的位置是否在這個選區內,假如是,就把dBuffer中的相應位置置為255,否則就是0。詳情請參閱代碼,為了使程序流程清楚,代碼做了適當的整理。

//=============================PluginMain Start====================== DLLEXPort MACPASCAL void PluginMain (const short selector, PISelectionParams *selectionParamBlock, long *data,short *result) { //顯示About對話框 if (selector == selectionSelectorAbout) { DoAbout((AboutRecordPtr)selectionParamBlock); } else { static const FPRoc routineForSelector [] = { /* selectionSelectorAbout DoAbout, */ /* selectionSelectorExecute */DoExecute }; Ptr globalPtr = NULL;// Pointer for global strUCture GPtr globals = NULL; // actual globals //包裝selectionParamBlock到globals中,真正有用的還是globals->selectionParamBlock globalPtr = AllocateGlobals ((uint32)result, (uint32)selectionParamBlock, selectionParamBlock->handleProcs, sizeof(Globals), data, InitGlobals); if (globalPtr == NULL) { *result = memFullErr;return; } globals = (GPtr)globalPtr; //調用 DoExecute 函數 if (selector > selectionSelectorAbout && selector <= selectionSelectorExecute) (routineForSelector[selector-1])(globals); else gResult = selectionBadParameters; if ((Handle)*data != NULL) PIUnlockHandle((Handle)*data); } // about selector special } //=============================PluginMain End================================= //=============================DoExecute Start================================= void DoExecute (GPtr globals) { //一些變量聲明,省略... //... // //從剪貼板中讀取自己定義格式的選區信息,保存到全局變量中,我加的 //省略部分內容 gQueryForParameters = ReadScriptParams (globals); gStuff->treatment = 0;//KeyToEnum(EnumToKey(gCreate,typeMyCreate),typeMyPISel);
//忽略原程序的UI參數處理 //獲取讀取端口 gResult = ReadFromWritePort(&selectionRead, selection->port); //省略部分內容 //分配內存 gResult = AllocateBuffer (kBufferSize, &sBuffer); if (gResult != noErr) goto CleanUp; gResult = AllocateBuffer (kBufferSize, &dBuffer); if (gResult != noErr) goto CleanUp; gResult = AllocateBuffer (kBufferSize, &rBuffer); if (gResult != noErr) goto CleanUp; sData = LockBuffer (sBuffer, false); dData = LockBuffer (dBuffer, false); rData = LockBuffer (rBuffer, false); //省略部分內容 //統計要處理的通道 curChannel = composite; while (curChannel != NULL) { if (DoTarget curChannel->target : curChannel->shown) total += AccountChannel (curChannel, transparency, selection); curChannel = curChannel->next; } //進行實際的處理工作 while (curChannel != NULL) { if (DoTarget curChannel->target : curChannel->shown) { ApplyChannel (globals, curChannel, &sDesc, transparency, &mDesc, selection, selectionRead, &dDesc, &rDesc, &done, total); if (gResult != noErr) goto CleanUp; } curChannel = curChannel->next; } //善后工作... } //=========DoExecute End===========//========ApplyChannel Start======== static void ApplyChannel (GPtr globals, ReadChannelDesc *source, PixelMemoryDesc *sDesc, ReadChannelDesc *mask, PixelMemoryDesc *mDesc, WriteChannelDesc *dest, ChannelReadPort destRead, PixelMemoryDesc *dDesc, PixelMemoryDesc *rDesc, int32 *done,int32 total) { //聲明變量,參數檢查,省略 //內層循環中,每次讀取64×64的塊處理 //#define kBlockRows 64 for (row = limit.top; row < limit.bottom; row += kBlockRows) for (col = limit.left; col < limit.right; col += kBlockCols) { //省略部分內容 gResult = ReadPixels (destRead, &scaling, &area, dDesc, &wrote); //省略部分內容 gResult = ReadPixels (source->port, &scaling, &area, sDesc, &wrote); s = (unsigned8 *) sDesc->data;//這里是原圖象數據 d = (unsigned8 *) dDesc->data;//這里保存處理結果 //逐個象素處理64×64的塊 for (row2 = 0; row2 < kBlockRows; ++row2) { int y = row + row2; for (col2 = 0; col2 < kBlockCols; ++col2) { int x = col + col2; int nRc = 0; bool bFound = false; while(nRc < g_rcCount)//g_rcCount是一共要顯示的區域數,通過剪貼板傳遞計算 { if(PtInRect(&g_rcArr[nRc],x,y))//g_rcArr存放所有要顯示的區域 { *d = 255;//這個象素處于選區內 bFound = true; break; } ++nRc; } //if(!bFound) *d = 0; ++s; ++d; ++r; } } //處理完畢一小塊,寫回 gResult = WritePixels (dest->port, &area, dDesc); //省略部分內容 } } //========ApplyChannel End=====

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频男人的天堂| 日本精品一区二区三区在线播放视频| 68精品久久久久久欧美| 91精品国产91久久久久久吃药| 欧美在线日韩在线| 在线电影欧美日韩一区二区私密| 欧美日本亚洲视频| 欧美在线视频网| 亚洲**2019国产| 一区二区在线视频| 国产欧美日韩视频| 九九热99久久久国产盗摄| 中文字幕欧美视频在线| 国产精品综合久久久| 亚洲人在线视频| 免费av在线一区| 国产精品av电影| 精品成人69xx.xyz| 欧美日韩激情小视频| 国产成人在线播放| 九九热精品视频国产| 欧美成人亚洲成人日韩成人| 亚洲已满18点击进入在线看片| 992tv在线成人免费观看| 8050国产精品久久久久久| 亚洲国产精品热久久| 日韩美女在线观看| 国产精品入口日韩视频大尺度| 国产成人精品网站| 国产成+人+综合+亚洲欧美丁香花| 亚洲福利视频二区| 欧美日韩午夜视频在线观看| 欧美一级淫片aaaaaaa视频| 精品亚洲一区二区三区四区五区| 亚洲片国产一区一级在线观看| 一本色道久久综合狠狠躁篇的优点| 国产欧美精品在线播放| 韩国v欧美v日本v亚洲| 日韩精品中文字幕久久臀| 久久久久久999| 久久九九精品99国产精品| 日韩激情av在线免费观看| 成人有码视频在线播放| 日韩最新在线视频| 欧美在线视频免费观看| 久久久在线免费观看| 国产精品爽黄69天堂a| 久久精品国产精品| 色妞欧美日韩在线| 久久精品国产精品亚洲| 国产精品一区二区久久精品| 久久久免费精品视频| 久久久久久中文| 国模精品一区二区三区色天香| 成人性生交大片免费看视频直播| 国产精品极品美女粉嫩高清在线| 亚洲精品狠狠操| 尤物yw午夜国产精品视频| 亚洲一区二区三区香蕉| 在线观看精品自拍私拍| 91亚洲精品久久久| 亚洲精品欧美日韩| 少妇高潮久久久久久潘金莲| 欧美成人免费在线观看| 97视频免费观看| 国产精品96久久久久久又黄又硬| www国产精品视频| xvideos成人免费中文版| 日韩av免费在线| 欧美激情久久久久| 久久99国产精品自在自在app| 亚洲伊人久久大香线蕉av| 欧美电影免费观看电视剧大全| 人人做人人澡人人爽欧美| 777精品视频| 国产精品h片在线播放| 欧美成人精品一区二区| 97在线观看免费| 性色av一区二区三区免费| 姬川优奈aav一区二区| 中文字幕九色91在线| 日本aⅴ大伊香蕉精品视频| 国产婷婷色综合av蜜臀av| 亚洲精品网站在线播放gif| 国产精品视频内| 欧美激情一级二级| 91视频免费在线| 久久69精品久久久久久久电影好| 亚洲精品久久久久久久久久久久久| 亚洲人成电影网站色| 国产综合久久久久| 国产98色在线| 久久精品在线播放| 国产在线日韩在线| 日韩欧美高清视频| 日韩精品中文字幕在线观看| 在线播放精品一区二区三区| 日韩一区二区精品视频| 91伊人影院在线播放| 欧美插天视频在线播放| 日韩精品视频观看| 国产精品久久婷婷六月丁香| 欧美日韩一区二区三区在线免费观看| 国产欧美最新羞羞视频在线观看| 2019精品视频| 91亚洲精华国产精华| 久久久噜噜噜久噜久久| 国产精品久久久久91| 亚洲精品二三区| 日韩av电影在线免费播放| 91香蕉电影院| 亚洲精品videossex少妇| 日本免费久久高清视频| 国产热re99久久6国产精品| 国产一区二区三区精品久久久| 国产精品高潮在线| 欧美视频免费在线| 亚洲人线精品午夜| 久久久免费精品视频| 亚洲精品久久久久久下一站| 日本国产高清不卡| 国产精品揄拍500视频| 久久免费成人精品视频| 亚洲一区第一页| 国产精品老女人视频| 亚洲欧美成人精品| 国产一区二区三区久久精品| 国产精品尤物福利片在线观看| 欧美一区二区三区……| 91国产一区在线| 91黑丝在线观看| 亚洲性69xxxbbb| 国产精品男人的天堂| 97精品视频在线| 欧美色图在线视频| 亚洲精品视频网上网址在线观看| 亚洲国产又黄又爽女人高潮的| 成人淫片在线看| 亚洲第一级黄色片| 国产成人综合亚洲| 一级做a爰片久久毛片美女图片| 国产精品免费久久久久影院| 欧美在线视频一区二区| 插插插亚洲综合网| 国产精品极品美女在线观看免费| 日韩av免费一区| 亚州成人av在线| 国产精品www色诱视频| 亚洲欧美国产精品专区久久| 亚洲视频在线免费看| 日韩二区三区在线| 久久69精品久久久久久国产越南| 欧美麻豆久久久久久中文| 国产小视频国产精品| 欧美精品一区二区三区国产精品| 亚洲精品久久久久中文字幕欢迎你| 亚洲成人精品视频在线观看| 一区二区三区日韩在线| 国产女人18毛片水18精品| 亚洲aa在线观看| 国产视频一区在线| 精品国产成人av| 国产精品96久久久久久又黄又硬| 日韩国产在线播放|