2008年12月11日 星期四

C++ Builder 專案 - Check Point

  從2個星期之前寫完期末BCB專案到現在,我的進度真的是很慢呢!我發現到期末時可能會來不及,沒辦法做出計劃書裡面全部的東西。我的期末專案是要寫出一個可以對BMP圖檔做影像處理的程式,先來說一下目前我BCB程式的進度吧~


  這個是我目前BCB程式寫出來的介面,感覺非常的......單調。大概說明一下功能,左邊的框框是要放讀取進來的圖片,而右邊的框框則是放處理過後的圖片。下面的按鈕就是不同的影像處理功能,按下去就會將圖片做處理,然後顯示在右邊的框框。在最下方有一個進度條,在做影像處理時,進度條可以讓使用者知道目前程式的處理進度。在進度條的左上方,我有用一個Label來顯示目前圖片的路徑。



  先來介紹第一個按鈕的功能,就是老師在上課時教過的互補色啦!在將圖片開起之後,就可以點下面的按鈕了,上面那張圖是按下互補色之後的結果。用255分別減掉目前R、G、B的值,算出來後的結果顯示出來就是互補色啦~


  接下來下面的按鈕就是將彩色圖片轉成灰階圖片,這個老師在上課時也有教過囉,上面那張圖就是按下去之後顯示的結果。大概的概念就是將R、G、B的值加起來,然後除以3,再將結果放回原本的R、G、B陣列裡面,輸出之後的圖片就變成灰階的圖片了。


  再來是浮水印功能的按鈕,這邊我用了2個按鈕,一個是先開啟浮水印的圖案,另一個是將浮水印圖案加到原本開啟的圖片上面。不過目前只能把浮水印加在左上角而已,因為那樣成是比較容易寫...... 不知道在期末的時候,來不來得及再把這部分改好一點。


  再來以下的按鈕功能老師就沒有教過了,上面那個圖片是按下左右翻轉後,圖片會左右交換過來。看上面的貼圖就可以看出來了,翻轉後原始圖片和新圖片是左右對稱的。


  在左右翻轉之後,我又想到可以用類似的方法做出上下翻轉的效果。上面那張圖片就是按下上下翻轉之後的結果。其實這2種功能都只是在For迴圈裡面改一下東西而已,並沒有甚麼特別的演算法。

  接下來的3個按鈕一起說明好了,因為其實是一樣的功能。上面三個處理過後的圖片,很明顯的就是紅綠藍三個顏色。這3個按鈕是分別取出原始圖片的RGB值,然後單獨將R或G或B的值直接顯示在新圖片上。


  最後一個按鈕的功能是把圖片變得亮一點,從上面的圖面可以看出,好像變得有點白白的。我的做法是將RGB的值分別加上50,然後顯示出來,所以圖片看起來應該就會變得比較偏亮一些。當然有增亮就會有讓圖片變暗一些的功能了,不過目前那個按鈕還沒有實作出來,所以就沒有貼圖了。

  大家可能會在上面的按鈕中看到一個"馬賽克",那個按鈕目前的功能也還沒有實裝,我還在想要怎麼讓它輸出時會變的有馬賽克的效果,期末時應該也是做得出來的。

  目前的進度大概就是這些功能,接下來除了還要繼續再增加新的按鈕功能之外,我也在想到底要怎麼做版面的設計,因為按鈕快要不夠放了...... 不過我目前還沒有頭緒,不知道最後會做成什麼樣子。

  接下來要說的就是我目前所碰到的問題,其實這個程式有非常多的Bug,用一用很容易就當掉了,有很多的限制都沒有設定好,所以常常會有錯誤發生。最直接發生的問題就是,當在按下開啟圖片時,會出現資料夾的視窗讓使用者選擇要開啟的圖片,但是當這個時候按下取消時,鄭個程式就會發生錯誤了。

  我先列出一些目前有想到的問題,其實問題還真的多到記不起來= =

問題:

  1.程式碼太長如何換行?

  2.若是開啟圖片時按取消會發生錯誤 (12/18已解決)

  3.開啟JPG圖檔無法進行影像處理(BMP才行)

  4.如何再開啟圖片前,設定按鈕為無法點選的狀態? (12/18已解決)

  5.如何將處理過後的圖片儲存? (12/18已解決)

  6.圖片路徑不能為中文名稱

  7.當浮水印圖片大小大於原本圖片時,會發生嚴重錯誤

  8.太多了,還沒想出來......

  進度報告就先到這邊吧!未來只剩下2個星期的時間,有的課又要做報告,又要準備期末考的,不知道有沒有時間來把BCB程式趕完呢......

5 則留言:

  1. 關於問題2~
    在開啟圖片的檔頭那~
    加入這行...
    就OK了~

    if (! OpenPictureDialog1->FileName.IsEmpty())

    回覆刪除
  2. 關於問題 4:
    Button元件有一個 Enabled 的 Property, 在圖片開啟前, 請用指令設定為 false,
    Button1->Enabled = false;

    在圖片開啟後, 請設定為 true,
    Button1->Enabled = true;

    回覆刪除
  3. 關於問題 5 :
    請先拉一個 SavePictureDialog元件進來, 然後使用下列指令即可將 Image1 儲存成 BMP 檔。
    Image1->Picture->SaveToFile(SavePictureDialog1->FileName);

    回覆刪除
  4. 目前問題2、4、5都已經解決了~
    但是關於問題3,目前的情況是可以開啟JPG的圖檔並顯示在程式上面,但是無法將RGB的值抓出來放進陣列裡,當程式執行到將RGB值上入陣列的指令時,他就會出現錯誤了。
    我想這應該是JPB檔案格式和BMP不同的關係吧!
    所以不能用BMP圖檔的處理方式來用在JPG檔案上。
    謝謝你們的回答囉~
    繼續來更新我的程式......

    回覆刪除