2015年11月21日 星期六

資工四甲 01360912 陳奕穎 HW03

因為我有兩位教授不與學校一起考期中考,而是另外選時間考,所以我直到這星期二 (11/17/2015) 期中考才算結束,然後我從星期三開始做這個作業,加上寫這個部落格,花了我大概三天半的時間。

在期中考前,我還沒著手做這作業,我有看 PPT,以為我已經懂了 ,可是沒有實際動手推導過一次公式,結果我就在本科的期中考上得到了一次慘痛的教訓──被扣了十幾分有關這個作業的題目,期中考結束後,我著手做這個作業,當然就有動筆推導過一次公式,才發現原來我對這個章節的公式推導完全理解錯誤! 
我一直以為 Input、Output 的公式是一樣的,以為我們只是在把它們做結合,整合成一個比較方便的公式,但他們完全是相反的公式在做結合與推導。

在實作方面,有一個問題讓我非常困擾,那就是如果你用 autosize 雖然可以顯示出完整的照片,但是照片會很大一張,然後 Form 就要拉很大一個,一開始我的解決方案是用小畫家照原圖比例去縮放成比較小的照片,不過這太愚蠢了,後來我發現將 XE2 裡 TImage 元件的 Stretch 這個屬性打勾 (如下圖),這樣就能顯示完整圖,又能調整圖片的大小。

Stretch在這裡



然後,我莫名其妙的在畫 Level 的圖時卡關很久,我不知道我一開始在想甚麼,明明就只要像學弟說的分三段畫就好了 (這次又是參考學弟的想法了......),我一開始卻想用跟畫 Curve 一樣,一點一點的畫,這樣就算了,我的腦袋那時候就好像是鬼打牆,一直想不出怎麼一點一點的畫,我在猜可能是因為這次我要製作的 Level 、Curve 圖的寬跟高都要重新計算比例,我的內心很厭惡這個動作,所以自動中止思考,不管如何,我竟然花了大概兩天左右的時間在想這個明明理解公式後就會是很簡單的東西,真是太不應該了,成果如下圖。

未調整

調整後

再來是 Curve ,Curve 這部分在弄懂了 Level 後,就會覺得都是一樣的東西,不過就是套用的公式不同,不過我也花了一天的時間在這上面,原因是為了將 Curve 與 Level 整合在一起,我本來也是想分開用,但是教授說可以整合在一起而且我看到 PhotoShop 上面真的是合在一起的,還弄得超酷的,所以我也想試試看,其中比較麻煩的點大概就是,該如何知道曲線 
y = ax^2 + bx + c 
 a、b、c 的係數為何吧! 我後來是用高中的克拉瑪公式來求得這三個係數的,怎麼使用? 簡單說就是將 (iInputMin , iOutPutMin) 、 (iInputMax , iOutPutMax)、 (點按的 X , 點按的 Y) 當作參數帶入 y 函式就會得到三元一次聯立方程式,就能用克拉瑪公式了! 
求出係數後,就跟一般 Curve 是同樣的做法了,還有一點值得注意,那就是帶入的使用者點按的 Y 值,要記得他是從左上角開始算的,所以要先用 Y = imCurve->Height - Y ,再把 Y 帶入,不然就會發生跟我一樣,一直以為是克拉瑪公式算錯,可是怎麼檢查就是沒錯,後來才發現是在這個小地方錯了,結果如下圖。

這是一般 Curve

這是 Level 未加 Curve

這是 Level 加 Curve
結論 :
          PhotoShop 不愧貴為修圖神器,我只不過是做它其中微乎其微一項功能,就令我如此頭疼,而且說實話,雖然我是將 Level 與 Curve 整合在一起了,但是還是有許多 bug 尚待修正,舉例來說,如果你先調 Level 再調 Curve 那它不會有任何的問題,顯示的就像我預想的一樣,不過你要是調過了 Curve 再調 Level 就會顯示不正確的圖,還有 iInputMin > iInputMax 時,會顯示成很奇怪的圖,看來我的學習之路還很漫長。

修正 :
         剛剛在寫部落格寫到結論時,我突然想到我的 bug 是出在哪裡,出在因為我的 Curve 會用到使用者點按的 X、Y 的値,而因為要計算 y = ax^2 + bx +c 要把 Y = imCurve->Height - Y ,只調 Curve 或先調 Level 再調 Curve 不會發生問題是因為每次都會有新的 X、Y 值,但是反過來就會出現大問題了,X 還沒關係,Y 則每次調 Level 就會進行一次 
Y = imCurve->Height - Y
當然就有會問題囉! 
而 iInputMin > iInputMax 時會出現奇怪的圖依舊無解,PhotoShop 的解決方法是不讓使用者能輸入
iInputMin > iInputMax 的値。

沒有留言:

張貼留言