2016-11-18 51 views
0

所以我不是編碼專家:我只是對幾個位和bob有一個模糊的理解。RGB陣列的不透明度

我知道像素尺寸X * Y的圖像存儲在大小爲3 * X * Y的數組中,其中從給定(x,y)值拉出的每個矢量對於3個RGB值具有3個元素。

我也明白,也可以在4 * X * Y數組中存儲圖像,其中每個拉取的矢量現在有4個值,RGBA和A是Alpha,用於表示特定像素的不透明度。

現在我進入動畫,並在黑色背景上繪製白色鉛筆圖,並將其導入到Flash中。我希望繪圖的黑色部分更透明,更輕的部分更不透明。我有以.png格式保存的圖紙掃描。

如果我對如何在'數組級別'上操作圖像有任何想法,我可以自己對此進行刺探,但我很茫然。

我需要的是,給定一個.PNG圖像和參考RGB值{ABC}中的程序,獲得圖像的RGB陣列並將其轉換成一個,RGBA陣列使得:

一個RGB值的像素{PQR}

......變爲......

RGBA值的像素{PQR 1-M [(| PA |^2 + | QB |^2 + | rc |^2)^ 1/2]}。

其中M是一個歸一化因子,這使得最大α值= 1。

即,M = 1/[(255^2 + 255^2 + 255^2)^ 1/2])= 0.0026411 ...

即,替換像素的alpha值是像素的顏色和可以輸入的某個參考顏色之間的「距離」。

然後需要將新的RGBA陣列導出爲PNG圖像。

任何想法或任何其他動畫師知道這是否可以直接用actionscript完成?


示例:參考= {250 251 245}

RGB陣列=

| {250 251 245} {250 250 250} |

| {30 255 22} {234 250 0} |

......變爲......

RGBA陣列=

| {250 251 245 1} {250 251 245 0.987} |

| {30 255 22.1173} {234 250 0 0。352} |

+0

你似乎有涉及數學的處理,什麼是掛斷?這不是一個代碼寫入服務。 –

+0

不,我知道,這只是我不知道如何實際執行它。我只是在Matlab中完成了編碼的基礎知識,所以我完全失敗了。 –

+0

聽起來很有意思...如何處理一些示例圖像? –

回答

0

你可以在命令行中簡單地做到這一點,ImageMagick它安裝在大多數Linux發行版上,可在OSX和Windows上免費獲得。

「祕密醬」-fx運營商 - 描述here

所以,讓我們產生一個安全工程師黑色圖像,然後使用-fx使得紅色根據我們是從左側(i)哪些部分的寬度(w)的整個圖像變化來計算紅色通道:

convert -size 300x200 xc:black -channel R -fx 'i/w' result.png 

enter image description here

注意,我生成的圖像「上即時」-size 300x200 xc:black,而如果你有在它的動畫幀PNG文件,你可以把中,在其頁碼花邊。

現在讓我們說,我們要改變不透明度/阿爾法太 - 根據來自頂部的距離縮小圖像:

convert -size 300x200 xc:black -alpha on \ 
    -channel R -fx 'i/w'     \ 
    -channel A -fx 'j/h' result.png 

enter image description here

好了,就快了...你功能更復雜一點,這樣,而不是命令行,每次上打字的話,我們可以把它放在一個腳本文件名爲RGB2Opacity.fx這樣的:

convert -size 300x200 xc:black -alpha on -channel A -fx @RGB2Opacity.fx result.png 

其中RGB2Opacity.fx簡單,看起來像這樣的時刻:

0.2 

現在我們需要把你的「參考」像素在命令行中與您的動畫框架,使ImageMagick的可以計算出差異。這意味着你的實際的命令行看起來或多或少酷似如下:

convert -size 300x200 xc:"rgb(250,251,245)" YourImage.png -alpha on -channel A -fx @RGB2Opacity.fx result.png 

然後我們需要實現你在-fx腳本文件公式。您的變量名稱必須至少有2個字母,並且其中沒有數字,並且您應該爲不透明度返回單個值。變量都在[0,1.0]之間縮放,所以你的255縮放比例有些不同。我沒有樣本圖像,我不肯定的答案應該如何看,但它會很接近這個:

MM=1/pow(3,0.5); 
pmasq=pow((u.r-v.r),2.0); 
qmbsq=pow((u.g-v.g),2.0); 
rmcsq=pow((u.b-v.b),2.0); 
1-MM*pow((pmasq+qmbsq+rmcsq),0.5) 

我不知道是否/如何把意見在-fx腳本,因此我將解釋變量名以下:

  • pmasqp減去a平方。

  • qmbsqq減去b的平方。

  • rmcsqr減去c的平方。

  • u.r第一圖像在ImageMagick的的列表中的紅信道,即參考像素的紅色通道。

  • v.g圖像在ImageMagick的的列表中的綠色信道,即動畫幀的綠色通道。

現在讓我們來創建動畫幀:

convert xc:"rgb(250,251,245)" xc:"rgb(250,250,250)" xc:"rgb(30,255,22)" xc:"rgb(234,250,0)" +append frame.png 

enter image description here

,並檢查它看起來是正確的:

convert frame.png txt: 

輸出

# ImageMagick pixel enumeration: 4,1,65535,srgb 
0,0: (64250,64507,62965) #FAFBF5 srgb(250,251,245) 
1,0: (64250,64250,64250) #FAFAFA grey98 
2,0: (7710,65535,5654) #1EFF16 srgb(30,255,22) 
3,0: (60138,64250,0) #EAFA00 srgb(234,250,0) 

如果我們應用,爲您的形象和檢查結果,你可以看到我已經得到了它稍有不妥的地方,butI'll離開你(或其他一些耀眼的火花)的工作說出來......

convert -size 4x1 xc:"rgb(250,251,245)" frame.png -alpha on -channel A -fx @RGB2Opacity.fx result.png 

convert result.png txt: 

# ImageMagick pixel enumeration: 4,1,65535,srgba 
0,0: (64250,64507,62965,65535) #FAFBF5FF srgba(250,251,245,1) 
1,0: (64250,64507,62965,64764) #FAFBF5FC srgba(250,251,245,0.988235) 
2,0: (64250,64507,62965,19018) #FAFBF54A srgba(250,251,245,0.290196) 
3,0: (64250,64507,62965,29041) #FAFBF571 srgba(250,251,245,0.443137)