不是人人都會分身,也不是人人都看得見分身。不過呢,寫程式讓一張圖片出現分身,這就容易得多。只要你這題能獲得AC,就有機會了!
首先讓我講解一下圖片合成的基本原理。
圖片只有RGB值的情況
foreground是前景(添加圖片)。background是背景(原始圖片)。前景覆蓋於背景之上。
兩張圖片相疊,一定比例保留前景顏色,剩餘比例當作背景顏色,如此才能達成半透明效果。寫成數學公式就是:
Rfore * OPACITY + Rback * (1.0 - OPACITY) = Rnew
此處以R值為例。RGB皆如此。計算結果四捨五入,滿足RGB數值範圍。
OPACITY是前景札實程度(不透明度)。OPACITY是一個比例數值,介於0與1之間。OPACITY是1,完全是前景(完全不透明);OPACITY是0,完全是背景(完全透明)。OPACITY的大小,決定了最終結果是偏前景、還是偏背景。
這個觀念即是國中數學的內分點、高中數學的線性內插。
圖片擁有RGBA值的情況
這不是本題要處理的情況,只是順便說明:
1. 調整A值的範圍:從整數[0, 255],改為浮點數[0.0, 1.0]。
2. 計算背景顏色,考慮背景A值:Rback * Aback。
3. 計算合成顏色,考慮前景A值:Rfore * Afore + (Rback * Aback) * (1 - Afore) = Rnew。
4. 計算合成後的A值:Afore + Aback - Afore * Aback = Anew。
5. 考慮合成後的A值,調整合成顏色:Rnew / Anew = Rtrue。
6. 還原A值的範圍。
7. 計算結果四捨五入。小於0請設定為0,大於255請設定為255,滿足RGBA數值範圍。
8. 小心處理 Anew 等於0的情況。
原理講解完畢。
現在給你一張前景(添加圖片),一張背景(原始圖片),請將前景覆蓋於背景之上。指令格式如下:
X Y OPACITY
前景的左上角像素,對準背景的座標(X,Y)。座標(0,0)是左上角像素,座標(W-1,H-1)是右下角像素,W H是圖片寬高。前景可以超出背景範圍,超出部分不處理。
指令範例:0 0 0,前景的左上角,對齊背景的左上角。
首先是一道指令:兩個整數 X Y (-10,000 <= X Y <= +10,000),一個浮點數 OPACITY (0.0 <= OPACITY <= 1.0)。
然後是一張前景(添加圖片):兩個整數 W H (1 <= W, H <= 256),是圖片的寬和高;接下來的 H 行,每行有 W*3 個整數,是每個像素的 RGB 值 (0 <= R G B <= 255)。
然後是一張背景(原始圖片):格式同上。
請輸出處理後的圖片。
0 0 0.5 1 1 255 255 255 1 1 0 0 0
1 1 128 128 128
1. 學術上,這稱做Image Compositing,圖片合成。圖片合成有許多演算法,本題採用了最簡易的演算法 Alpha Compositing。Alpha Compositing的效果是半透明鬼影。因為效果太假了,所以大家鮮少使用此演算法,頂多用於視覺特效,例如過場效果。
2. 想要改善效果,有各式各樣的方式。例如去背處理「b423: 魔術橡皮擦」,例如漸層處理「b427: 漸層色彩」,例如模糊化處理「b425: 抽菸動作 請勿模仿」,例如添加亂數誤差。有興趣的人可以自己組裝這些演算法。
編號 | 身分 | 題目 | 主題 | 人氣 | 發表日期 |
沒有發現任何「解題報告」
|