1. 程式人生 > >【Adobe CEP 擴充套件開發】Playful Palette 調色盤

【Adobe CEP 擴充套件開發】Playful Palette 調色盤

demo

關於論文

這個論文其實還是比較簡單的啦(我不過我只看了和寫的部分有關的內容)
主要部分一個是水滴融合,一個是提出了新的互動方式(的樣子)。(為什麼不是一篇HCI論文而是一篇圖形學論文)
因為原文是在Pad上的一個軟體,所以相對而言互動會方便很多。

所以互動方式就只能用滑鼠點選了——

關於水滴融合,其實我的理解就是
這裡寫圖片描述

看看這個等勢面!多麼完美的水滴融合模型啊!(它可能有一個更專業的名詞叫做隱式曲面)
然後用的是據說是高斯的一個近似
這裡寫圖片描述
剩下的就是對於在某個勢能以上的點判斷各部分的貢獻比例了

步驟

事件和互動

落下不會寫前端的眼淚……
js的資料處理都折騰了很久。經常小數轉十六進位制就炸了啊、轉了十六進位制沒有補0啊……格式輸出不對啊……還好比jsx debug方便很多(不太會用Adobe ExtendScript Toolkit)。
好像在js到jsx不能直接傳陣列。我後來是弄成字串在split的。

然後在CEP JavaScript和ExtendScript 端之間傳資料的時候,我還出現過事件監聽迴圈的那種炸(……)網路環路那種。

在canvas上顯示小球的時候,是遍歷canvas上每一個點,根據位置判斷應該輸出什麼顏色。

球的資訊同步

然後基本的介面是
這裡寫圖片描述
對就是那麼傻。

一個球對應一個顏色。js中有一個數組記錄球的數量,jsx中一個數組記錄圖層的資訊。然後接收到顏色變化事件之後,更新mask的顏色。

新建顏色的jsx程式碼

function addNewColor(inColor) {
    try {
        // 新建兩個圖層並塞到數組裡
        var
layerRef = app.activeDocument.artLayers.add(); layerRef.name = "ColorMixer"; var layerRefMask = app.activeDocument.artLayers.add(); layerRefMask.name = "CM mask"; myLayerSets[index] = layerRef; index++; myLayerSets[index] = layerRefMask; index++; // layerRefMask.blendMode = BlendMode.NORMAL; // auto
// 移到合適的位置 這裡的worklayer就是之前那個workspace worklayer.move(layerRef, ElementPlacement.PLACEBEFORE); worklayer.move(layerRefMask, ElementPlacement.PLACEBEFORE); layerRefMask.grouped = true;//設為剪下蒙版 app.activeDocument.selection.selectAll;//選擇所有顏色 var colorRef = new SolidColor; colorRef.rgb.hexValue = inColor;// 設定顏色 app.activeDocument.selection.fill(colorRef); app.activeDocument.activeLayer = worklayer;// 把啟用圖層回到Workspcace 免得讀完之後位置不對 } catch (e) { alert("addNewColor" + e); } }

你敢信剪下蒙版是grouped……

繪製

每次更新顏色的時候,需要把畫在workspace上的內容分塊繪製到下面的分圖層中。

這個還是比較麻煩的(撫額)
分幾步
1. 選出在workspace上的繪製內容
2. 把下面圖層中被覆蓋的內容清空
3. 在下面的workspace按不同的顏色組成填充
第二步是為了防止在上面的顏色已經繪製的內容遮擋先繪製的內容。
但是這樣的模型是有問題的。
主要是在透明度的問題上,由於這個沒有辦法讀取具體的透明度,所以沒有辦法分情況處理(或許有,讓我再想想有沒有好的操作)。一旦有了透明度之後,將這個顏色合併到其他顏色裡的操作會顯得格外複雜。

舉個例子、
比如圖層是
0層 —50%—
1層 — 50%—
現在要把兩個圖層調換順序,取得一樣的效果的話,我需要
1層 —25%— // ==50%*50%
0層 —67%— // == 50%/75%

所以如果有透明度的話處理起來會有問題。所以對於軟畫筆啊啥的,會有問題。感覺要是真想要避免這種問題的話,可能需要重新確定結構了、

接下來分別介紹那三步

1. 選出在workspace上的繪製內容

我也想不到這一步會很麻煩……
如果在操作PS的話直接Ctrl加點選那個圖層就行了。
然後翻遍了文件,artlayer沒有返回選區的函式。

於是開始找有沒有取artlayer的色彩範圍的函式……

最後的解決方法又是迷之智障了——
這裡寫圖片描述
這樣,然後取channel返回選區。

這也是為什麼每次我點一下那個外掛PS的取色板會抖,而且處理還非常慢了(捂臉)。

2. 把下面圖層中被覆蓋的內容清空

這個就selection.clear()一個命令就行

3. 在下面的workspace按不同的顏色組成填充

理論上也就selection.fill()一個命令
由於之前講過的透明度的問題,如果本來我想呈現的是兩個圖層各50%的顏色的話,下面那個圖層實際的透明度是100%

0層 —50%—
1層 — 100%—
這樣呈現的是0層50%,1層50%的效果

0層 —50%—
1層 — 50%—
這樣由於混合的效果(普通混合),下面一層實際顯示出來是25%

所以由於這個,需要進行一些預處理。

後面

第一個PS擴充套件,不枉我早年無知的時候玩過PS(???)
一開始想寫外掛的,然後發現外掛限制還蠻多的(而且看不懂例程),就寫了個擴充套件。

感覺最後效果一般吧——能交作業,但是遠遠沒到願意去用它的地步。很多地方還很粗糙。慢慢來吧。

哦然後最後引用我的傻兒子評價——

捨棄無用的取色功能,剩下有用的球。
這球真好玩.jpg

我覺得以上非常有道理可以考慮一下↑