2012年10月19日 星期五

96360210 黃彥羲


原圖

均化







一開始的時候真的有被困擾,必須要把OpenPictureDialog1->Execute外面加上if變成if(OpenPictureDialog1->Execute()),否則當你沒選擇檔案的時候,就會跳出該警告。(Save也是)




 

 
 


 
大致寫法是照著範例去更改,比較麻煩是把三張合而為一。
打勾以後取消該色直方圖,一開始是透過把該顏色畫筆改為白色重畫一遍,後來想到乾脆直接用FillRect白色填滿整張圖比較快。
三張圖合體後多了一些小麻煩,例如:MouseMove的事件是共用的,如果透過鼠標的X座標去抓資訊,例如顏色用X%3,會把沒有打勾的顏色資訊也顯示出來,還要多判斷該顏色是不是有勾選。後來看到老師範例裡的做法,如果多色同時勾選,只會顯示一個顏色的資訊(優先R>G>B),其他顏色會被忽略,算是設計上的缺陷吧!



 

Cumulative方面則是多宣告一個跟iHistogram[3][256]很像的CPCount[3][256],256是因為ColorLevel是從0~255,CPCount用來累計在該ColorLevel以前的所有Count。再把範例中iHR = int(( float(iHistogram[k][i]) * fHistogramScalar ) + 0.5)裡改成CPCount[k][i] * fHistogramScalar
,結果就出來了。

做到這邊可以發現,畫直方圖這段程式不斷的被重複,因此我一開始想到了method(function),可是BCB裡的function是不能使用到form裡面物件的。後來想到可以把重複的程式放到一個物件裡,然後給他一個事件(假設物件ABC,事件Click),之後就可以利用ABCClick(Sender);來呼叫這個事件。



均化


有了cumulative的資訊後,均化後的對應值=Cumulative/PixelCount*255,最後把每個點改為對應值即可。均化是照著面積比例去平均分配,因此Level較集中時,效果會比較明顯。我用的圖最大值不超過200,當均化以後,圖就會變亮。



沒有留言:

張貼留言