顯示具有 96360821 周稚翔 標籤的文章。 顯示所有文章
顯示具有 96360821 周稚翔 標籤的文章。 顯示所有文章

2010年1月16日 星期六

HW7

  現在是清晨五點半..眼皮好重
  除了考試考完把K書沒睡到的覺補回來外
  就馬不停蹄的趕作業,唉...
  因為在過兩個小時還得在星期六補六節課
  所以這部分的作業沒有充裕的時間達成自己原本的預期
  一想到這裡,上次那些信誓旦旦開作業繳交期限支票的大德們,
  都是靠自己完成的嗎..真不知道該說什麼了

  本來預計要修正出一個正常的WAVE,不過這樣怕連作業七都完成不了
  作業七的部分基礎是修改WAV的音量大小
  沒什麼難度,利用兩個WAV音量控制function
  取得音量的
  waveOutGetVolume(HWAVEOUT hwo, LPDWORD pdwVolume)
  
  以及設定音量的
 waveOutSetVolume(HWAVEOUT hwo, DWORD dwVolume)

  最初腦袋不正常的想利用兩個Button來提高音量跟降低音量
  雖然方法是很特立獨行,但是說實在的如果不做判斷跟額外的資訊提示
  不會比bar系列的元件來的直覺,而本來想用看看沒用過的TrackBar
  但是為了保險,還是直接使用曾經用過的ScrollBar

  步驟也很直覺
  當移動ScrollBar便取得原始的Volume然後加上ScrollBar的值設定音量
  本來神智不清的一移動就取音量然後直接加上ScrollBar的值Set
  然後Run了還覺得奇怪,咦..怎麼聲音加上去就下不來,只能加不能降..
  精神狀況不好的情況下寫程式..事倍功半阿~

  我原本另外想到一種處理方法,idea來源是圖片影像的透明化
  將兩張圖片重疊,把重疊的像素點相加除以2
  本來想實驗看看說,如果把兩個WAV檔案取出data本文音訊資料
  相加除以2會有什麼樣的效果,不知是會有remix的效果還是單純的變魔音..

  



  另外是想要改善的程式碼易讀性,過去修資料結構跟演算法的時候
  還不覺得struct是個好東西,一直到這學期
  其他專研組的同學程式能力大為精進,偶爾偷學兩昭
  剛好這裡派的上用場,就像之前在讀取BMP Header時
  老師有提供BMP的Header Struct結構
  不過因為當時已經自行設定完變數,覺得有些麻煩而且可以執行就好
  就沒去更動程式碼,這次則是因為看已經被精簡過的程式碼似乎
  還有再被精簡的空間,所以就試看看

  而結果算是好壞參半,一次直接計算檔案的總長度,然後把檔案的資料塞進
  設定好的結構當中,不用在對說讀第4 Bytes是啥、讀第16 Bytes是啥
  但是壞在出了點不知是哪問題的狀況

  Header讀取明顯有問題
  以下這張是正常的數值
  


  這張則是錯誤的
  


  從錯誤的方式推斷,猜測是結構中宣告的變數空間過大
  但是結構宣告如下:

struct Header_data{
  char ChunkID[4];     //[0] ChunkID
  long int ChunkSize;   //[4] ChunkSize
  char Format[4];     //[8] Format
  char Subchunk1ID[4];   //[12] Subchunk1ID
  long int Subchunk1Size; //[16] Subchunk1Size
  WORD AudioFormat;    //[20] AudioFormat
  WORD NumChannels;    //[22] NumChannels
  long int SampleRate;   //[24] SampleRate
  long int ByteRate;    //[28] ByteRate
  WORD BlockAlign;     //[32] BlockAlign
  WORD BitsPerSample;   //[34] BitsPerSample
  char Subchunk2ID[4];   //[36] Subchunk2ID
  long int Subchunk2Size; //[40] Subchunk2Size
};

  另外有以ShowMessage(AnsiString(char))
  的方法確認說Byte數是否正確
  確認結果無誤

  
  char   佔 1 Byte,char[4]就佔4 Byte
  long int 佔 4 Byte
  WORD  佔 2 Byte

  每個資訊所佔用的空間大小都正確
  所以這個問題還有待克服..六點十分了,
  如果下課了還有機會的話真想把它DeBug完...

==================================================

  找到其中一部分的錯誤,但是低級錯誤...
  BlockAlign跟BitsPerSample的資訊錯誤部分
  我宣告的4 Byte的Buffer供全部的資訊暫存用
  因為這兩個資訊各佔用2 Byte
  而計算是我是以4 Byte為前提下去計算
  結果導致BlockAlign跟BitsPerSample只覆蓋[0]、[1]的空間
  [2]、[3]還是上一個資訊的值
  丟去計算當然就錯了




  至於另外一部分還是有點問題
  直接看結構,結構自訂變數載入的值都正確


  但是單看自訂變數就會發現莫名其妙的東西..

HW8

數位媒體概論這堂課是開給二年級的課程
因為是多媒體學程的核心課程,大家都想說有就先修
怕以後衝堂或是無法預期的未知數
沒修到其他多媒體學程的核心課以致於不能畢業(?!)
所以去年要搶還搶不到呢!!
但是也因為班上同學大多都去年就修過了
所以得到了一些意見,想當然的
過去一直引人詬病的互評規則真的沒多少人喜歡
但還好老師這學期一開始就說明更改這個規則,這讓我大大鬆了一口氣
不然原本還擔心會被學弟們打爆!!
由老師來評分至少對同學來說算是公平的
不過我覺得..新評分方式開宗明義的說了70分裡面有10是拿不到的
也就是說學期總成績最高只有90分呀..(補上作業八加分最高93分)
對於一些可能想要衝總分的學生來說似乎好像還有一點分數的空間。

這學期上了這堂課對我來說還算不錯,因為上了大三之後
程式實作課程越來越少,腦袋在這樣石化下去
專研就等著變成石頭站在講台上給評審老師罵..
此外,上大學後總是在俗稱小黑的DOS環境下操作程式,
對於高中以VB入門的我來說著實是個不小的震撼彈
雖然語感沒有受到太大的影響,但是在撰寫上就會覺得綁手綁腳
而這門課程使用UI的C++ Builder是吸引我的原因之一,
而實際上也讓我感到很慶幸再這個時間點修習這個程式語言,
因為這學期同時修了系主任的WinSock程式設計就要求我們用UI,
雖然有VB的基礎,但是畢竟是號稱初學者用的程式語言,
總是依賴著它好像也不大好,其他同學就只能選擇重新自學一個UI的語言,
不論是MFC還是C#,變成都不知道是在學WinSock還是在自學程式語言
而我則可以將BCB現學現賣,幫了我個大忙。

至於課堂上的心得,可以感受到老師教學的熱誠,
但是大環境是這樣,真正想上課想學習的人似乎不多,
我想這屆選修的學弟們多少也是因為這門是核心課才選修吧..
在作業的難易度來說,講實在的,我覺得是真的太簡單,
有時候甚至簡單到心得不知道要寫什麼,這裡就有兩個問題
雖然我個人認為作業太簡單,但是對於這個班的大多數同學來說,
不論是不想做只想等著抄,或是做不出來乾脆等著抄,甚至是
會過就好死到臨頭再來打算的總總情況,使得老師不論是提供參考範例或是
乾脆降低作業難度,現狀沒有改善
而看著別人瞎混、老師得配合瞎混的人放慢步調
對想學習的同學來說,那股熱情遲早也會被無奈覆蓋掉,
但是又能說什麼呢~
另外一點的結論也是一樣,關於作業的問題
就拿藉由操作撰寫BCB來了解數位媒體的基礎知識,我覺得這我也受益良多
fopen、fseek、fread的威力馬上就能用在其他課堂的程式專題實作上
但是就像上面提到的,有些作業完成的沒有太多瓶頸或心得,
沒有心得就沒有分數,所以為了分數就得激發腦袋中的小宇宙榨出一些心得文章
就舉一個修IPC的同班同學來說好了
因為他一方面得應付學期總成績不得低於80分的壓力
每個禮拜三的Meeting還得預先啃上一堆paper
另一方面又得為研究所準備
常常是可以聽到他說他傍晚到晚上要先睡一下
晚一點再起來寫程式,他的作業不假他人之手這是大家同學都知道的事,
但是前不久看到作業分數公佈的時候心都涼了一半,
分數不到預期可能拉低學期總平均外,參考他程式的同學舌燦蓮花一番
分數還比他高出許多,不知道其他人怎麼想,
或許覺得把分數看那麼重幹麼,生平無大志只求六十分,這是大學生本分,
又或許有人認為,阿現實就是這麼現實,自己不掰點東西怪誰,不過
就像他自己說的,都是自己寫的,他也沒想過偷機取巧,
至少是犧牲睡眠時間做出來的,但是看到分數
除了無奈也不知道該感覺怎樣
但好在老師提供分數上訴空間,還有個可以化無奈為希望的機會..
對於看心得評分數這點,訓練表達能力是好事,
但仍舊存在這這些缺點

最後謝謝老師這學期的教學,也謝謝在怎麼做總是
有學生不知好歹的抱怨的亂世之中仍舊存在著的教學熱忱。

HW6

很不幸的期末考週過的非常充實以致於戰鬥持續到期末考週之後

題外話,這學期的修科目真的有些許小扯

雖然豪邁的修了系上23學分
但是有很多科目沒有統一考期末考
有三科拉到期末考前一週考試
變成我們的期末考比別人早開始
但是都到大三了,這種事情早該見怪不怪
真正到了期末考週過去的經驗是稍微會輕鬆一點
實際上,並沒有
而且還有些突變,怎麼別人準備期末考
我們卻在趕程式(不只數位媒體概論一科...)
大三上,期末考週被重新定義
比別人早一週開始,同時也比別人晚一週結束
題外話結束

對於本週HW6作業
我認為這是截至目前為止有難到我的作業
當然我是指要把波形頻譜Show出來
但是做事是要按部就序的來
不會走路更別說想要飛
不會開檔更別說想畫圖

對於老師講的,如果學了某種Skill
要在上手其他同類型的Skill會比較容易
我覺得很有道理,因為事實上也是這樣
光是看開檔這個動作
之前因為接續接觸了Bitmap、GIF檔案的Header
這次的WAV也不過就是換個格式,原理是一樣的
但是首先碰到的問題是
Header的定義WAV著實難找了一點點
wikipidia很顯然無法滿足需求
咕狗大神拜了後,首先是純定義的解說網頁
WAVE PCM soundfile format
就如同看到某個偉大的數學家定義出了一套數學公式以推論自然法則一般
通常就只有他本人很懂
其他的路人甲到路人N的無限大除非是剛好跟偉大數學家頻率相同
或是天才之外,平凡的我真的是霧裡看花,到底看到什麼也不知道
不死心繼續拜大神,找到了對岸的程式設計討論區
//不管是什麼程式語言有問題,對岸的前人同胞都恰好已經種好了樹
//反觀,想找到自家人的熱情教學解惑焉..真的不大容易
該討論區有利用C語言示範讀取Header info
配合著剛找到的WAV Format,似乎有點撥雲見日了

開啟一個新的project,把之前read bitmap的code copy過來
一邊用PSpad對照著老師提供的wav,一邊數著Byte
一邊照著網頁的Format去read每組資料
好不容易13組資訊設定完畢
醜是一定的,但是還是先確認正確性比較重要
接著就埋頭拉了27個Label....設定完畢後
關鍵性的一個Open...

perfect!!

文字敘述跳了一個check的步驟
perfect是在比對過Pspad的data後才喊出的

好了,完成一半了
接下來就是畫波形圖

波形圖怎麼畫, 不 知 道 ...
更慘的是找了好久仍舊找不到究竟WAV的data如何繪出一個WAVE
(有求必應的估狗大神這個優美詞句在這裡我沒有讓他出現...因為他破功了)
難道就放棄嗎?不太像我的作風

換一堆關鍵字一直查,就是查不到
靠著最後唯一的線索拼湊一個猜測
如果"音訊範例大小"為8 bits就將data 8 bits一組
而16 bits就將兩個8bits湊成一組
再用該值當作座標,利用第一次作業的方法
以Moveto AND Lineto畫線,這也算是個沒辦法中的辦法了

過程就一樣將data讀進Buffer然後依照前述處理法
老師提供的wav是16 bits 就一次讀進16 bits畫點
最後圖是畫出來了,但是明顯跟其他工具軟體所顯示的波形長的不一樣
這回真的只能搖搖白旗投降輸一半了
究竟該如何創造出波形圖呢...

程式起始畫面,直接利用MainMenu的File > Open選擇開啟檔案


接著Show出所有資訊以及一個怪怪的波形圖...




寫在最後,其實從一開始讀Bmp檔案的時候對於一串臭臭長長又重複出現的code


iFileSize = bitSize[0] +
      bitSize[1] * 256 +
      bitSize[2] * 256*256 +
      bitSize[3] * 256*256*256;


看了就想要自訂一個function來做這個運算
不過其實運用function已經在HW4、HW5的時候實作了
因為功能整合到HW4、HW5時,自己設定的一堆switch
稿的程式碼雜亂不堪,當時就想要用個自訂函數讓程式碼看起來簡單些
不過BCB要加一個自訂函數還得到.h去宣告
一開始不知道也是試了好久,最後仍然是拜咕狗大神解惑

但是後來我又想到一個偷吃步的自訂函數用法
只是因為自己懶的切換到.h去宣告function
所以索性乾脆creat一個隱藏的button當作自訂函數用
當要呼叫他的時候在其他的區塊內click()他就可以達到Call的效果~

言歸正傳



這次靠他如願解決了每讀一次就要臭臭長長一次
讓原本十分醜陋的程式碼稍微好看一點點..但是還是有改進空間

2009年12月17日 星期四

HW5

Update : 新HW5作業新增於分隔線後

完成HW4後,改善了之前提到的要把欲讀取的BMP檔以更人性化的方式開啟
(註:之前是將入徑寫死在程式碼中 "C:\\Bitmap.bmp")
另外閒著沒事便把程式介面來個大翻修
以Pagecontrol統整所有功能,使程式操作起來較系統化
也加入了狀態列將滑鼠座標與即時色彩值顯示在狀態列上

然後,是這禮拜的作業 HW5 - 讀取GIF的調色盤資訊並顯示出來

查了一下GIF檔頭資訊的格式,一邊用PSPad開啟老師提供的金龜子(!?).gif比對
原來GIF檔頭資訊還真精簡
GIF標籤、制定版本、長寬與不知名的3bytes之後就是一目了然的調色盤
看到這裡,作業已經在腦袋裡完成了九成,
讀取3bytes的RGB而已沒什麼困難,只要將他顯示出來就好

顯示出來.... 怎麼顯示出來?!
翻了BCB提供的眾元件,似乎沒有調色盤模組之類的玩意兒...
難不成要我拉出256個Panel來上色?! 這方法蠢到自己都想撞豆腐自殺
VB曾經寫過元件陣列,雖然說操作起來蠻方便的
但是一來,BCB的元件陣列我不會用
  二來,還是要拉出256個元件阿!!!

轉念一想,如果.. 用畫的勒?
一格一格一格畫出來.. 反正是程式畫,又不是我畫,感覺起來似乎可行
打開BCB,Set一個New space專屬於GIF 調色盤
開始順著感覺Key出填格子命令的程式碼
過程輕鬆愉快10幾行搞定,關鍵性的一Run...

唷~ 一次到位,絢麗奪目的256格調色盤
比對老師的調色盤後..

宣告收工,HW5破關

(翻新後程式介面)


HW5作業展示


這是從課程討論區抓下來的金龜子.gif檔案,開啟他


極致藝術,馬賽克完成



寫在最後面:本來還在想說要怎麼顯示GIF圖檔以及他的調色盤
要擠在同一頁?可是分開來感覺又降低關聯性
要另外開一個Pagecontrol?
拜託..這一加,控制開關得重新調整簡直是自討苦吃

最後要LoadFormFile時..咦 碰了?味瞎咪?
有求必應的辜狗大神告訴我.. 喔.. BCB要讀GIF要自訂套件喔...
那就這樣吧~


===================================


題目新增一項動作 - 調色盤依色彩亮度排序

聽到題目馬上直接想到使用陣列處理,然後再基礎的Sort比大小
雖然原先沒有用陣列去處理調色盤的顏色
不過將256個顏色assign給陣列不會太困難

剩的問題是亮度怎麼分析?
課堂上也有解答,乘以莫名其妙的數字轉灰階便是間接求出亮度

剩下就是將一團空想實現在BCB上
實際操作也沒問題,宣告幾個公用變數以供Sort元件存取Open元件所處理的色值
套上以前寫到爛的Sort方法

恩~ 成果看似跟老師的一樣
原本每格色彩之間沒有間隙,想說這樣還可以跟老師的範例做個區隔
不過看了看覺得都擠在一起好像不怎麼好看...

於是乎順手賞了它們一些個田埂,一個蘿蔔一個坑
果然是美觀了些~

除了從暗排到亮,另外生了一個從亮排到暗...
不過這沒啥好說嘴的就是,不過就大於變小於罷了....


開啟金龜子.gif Successful !!



依照亮度排序 - 暗 to 亮


依照亮度排序 - 亮 to 暗




2009年11月26日 星期四

HW4

作業邁向第四次
一直不斷加上去的功能讓整個程式碼變的很雜亂
雜亂的原因是由於我致力於架構出"像樣點"的Software
所以大量用到顯示/隱藏可使用/不可使用的屬性

例如:
之前的開啟圖檔後Show informations或轉成grayscale的功能
為了避免尚未load image就按下Buttom而造成錯誤
所以在load image前,Buttom屬性是設定成Disable的

當功能越多,判斷越多,開關越多的情況下
每每一個Buttom_click的function就要先佔掉一面的控制開關
不知道有沒有辦法可以好好整頓整頓那些雜亂的開關..


而這次作業上一次課堂上就做出來了
老實說是不經意的抓以前的程式碼變造的
//為什麼說不經意..原因有二
//一是因為我都是在筆電上處理BCB,而那個禮拜沒帶
//程式碼都在筆電裡,要重新拉出一堆物件
//還沒開始作作業應該都要下課了..
//另一個原因是期中考殺很大的必修要看不完了
//實在沒心思去寫程式,後來書越看越煩所以又跟同學借程式來試作

也因為沒有遇到什麼大到難以克服的問題
所以我認為是不怎麼困難的
倒是後來老師提出來的疑問還真的讓我咦了好大一下


fseek指向,然後用fread讀後
指標應該是理所當然的指向讀取的最後一個byte尾
但是如果把fseek抽離構圖迴圈,單留fread在裡面讀
會發生無法預期的狀況,解釋不出來的現象,還頗匪夷所思的...


因為電腦在期中考週的前一天故障
造成這個作業沒有充分的時間達到自己架構的模樣
(補充:作業五已實現)


程式初始如下:
從MainMenu選擇繪圖...就會讀取設定好的指定位置的檔案,開始繪圖















(畫到一半的時候)















讀檔完成後會一併Show出檔頭資訊
















比較要注意的地方應該是Bitmap檔頭奇異的儲存格式:
1.順序不是以R, G, B方式排序,而是以B, G, R排序
2.儲存的像素點是從左下到右上
(這尤其奇怪的,Image的左上座標是(0,0),右下是(X_MAX,Y_MAX)
就算是(0,0)倒反,也應該是從(X_MAX,Y_MAX)到(0,0)
但是這是題外話,一開始就沒有被這個排序規則搞到
因為找到了色彩值的檔頭位置後
為了要確定的確是某像素點的顏色
就組合起來比對,一下就發現像素點是從左下開始向右排序
)


原本的計畫是:
在繪圖的時候開啟一個新的Form或Frame來做繪圖的動作
繪圖完成後再把圖像Load到Image的物件中
再另外彈出一個Form/Frame來Show檔頭資訊
這部分還要稍微Serch一下參考範本;


而開啟的檔案路徑目前是寫死的
理想中是拉一個textbox讓使用者輸入檔案路徑
不過這樣一來雖然程式變的較人性化
但是要使用者輸入檔案路徑好像也是件麻煩事
因為要預防格式輸入錯誤去做判斷
而使用者要自己輸入路徑+檔名用起來也很不方便

2009年11月5日 星期四

HW3

本次作業 : 讀取並顯示 BMP 影像的檔頭資料

練習重點在於 fopen、fread .. 等檔案處理指令
老師第一次講授fopen、fclose、fseek、fread、fwrite時
消化有點不良,自己靠F1、搜尋引擎、MSDN摸索還是沒有多大進展
好在第二個禮拜又講了一次,終於有了點突破
也剛好另一門選修課需要撰寫socket傳送檔案給了莫大幫助
fopen用以開啟或說是建立一個檔案提供讀或寫
fread便是讀取檔案內的資料
//但是關於fread,在VC6.0使用的時候
//其read完資料不會移動指標
//還需要用fseek去指
fseek就是將指標移動到某個位置
fwrite就是將資料寫入到檔案
而最後有開啟就有關閉
關閉就靠fclose
靠摸索程式碼來熟悉用法間接思考指令運作模式
對我而言還是比較有效率的方法~


這次的作業直接接續HW2的轉8 bit灰階影像的程式繼續撰寫
老師是在Load Image時就以Message視窗顯示BMP的資訊
我做了些更改:在程式上加入了一個Show Info的botton
一個GroupBox以及一些Label
程式開啟初始畫面如下圖,為了避免錯誤
//例如:沒有Load進Image就要Show informations 會碰
將botton都暫時設為disable














載入BMP Image時便一併讀取了檔頭裡的檔案資訊
所以Show資料的Button只是純粹切換頁面用的
Show出資訊的Botton在檔案載入後便可以作用了














click botton後就會出現Information的GroupBox
裡面含有
檔案大小、影像寬度、影像長度、水平解析度、
垂直解析度、影像位元(位元深度)、壓縮演算法的影像資訊




















過程中有出現一點小狀況
那就是解析度並非畫面顯示的 96 dpi
而是" 3780 " 這個恐怖的數字
一開始懷疑是byte位置抓錯,但是比對wiki確認無誤後
又懷疑是wiki記載的資訊錯誤 (連這都懷疑似乎有點不明智阿..)
Google大神拜了之後又證明wiki沒有錯 (讓我覺得懷疑wiki是多此一舉)
一頭霧水且一度萌生乾脆把解析度的Label拿掉的念頭..
可是又想說如果拿掉之後..
整個GroupBox的Information看起來就很空虛
忽然在某個為了查詢檔頭的網頁裡看到了

解析度dpi的全名 - dot per inch

頓時豁然開朗啊.... 也沒那麼誇張
只是想到說如果轉換成其他單位看看的話..

這一try就try出了結果
3780 須除以39.3轉換成公尺就可以得到 96這個神奇的數字~

OK 快快樂樂的收工 END

2009年10月22日 星期四

HW2

本週作業:
讀入一個 24-bit 彩色 .bmp 影像
並將其轉換成 8-bit 灰階影像儲存!


基本上沒太大的問題
要轉換成灰階的做法,課堂上提示的 (R + G + B) / 3便能搞定

但是仔細想想題目,8-bit 灰階影像,又會有點疑問
8 bit = 256色,儼然算是彩色的影像
但又為何會跟灰階影像扯上邊呢?

存在著這疑問同時,上網想找其他轉「8bit灰階」的做法時
碰巧查詢到直接指定PixelFormat=pf8bit,但是這樣的效果為











得知的確8 bit是能夠呈現不精緻的彩色影像
所以為何不是用2 bit灰階、4 bit 灰階,而是選用 8 bit 灰階呢?
是因為24 bit的 R + G + B 除以三就是等於 8 bit嗎?
寫完程式才又突然想到..
2 bist有4種顏色,無法構成彩色圖像
4 bits有16種顏色,就算能構成彩色圖像也很難看
而8 bits可以儲存256種顏色,色彩值雖多但無法達到精細

那反過來..如果不是存彩色,而是存灰階色彩
反而可以構成非常精細的灰階圖像呀~


以下配合截圖說明程式

1.啟動畫面













程式畫面由
MainMenu(Open、Save、Exit)、
GroupBox、
Image方框、
ScrollBox、顯
示圖片位元的Label、
轉換的Button、
Reset Button、
進度條
其中MainMenu的Save、Transform Button為不可使用;
Reset Button、進度條為隱藏


2.開啟Bmp圖檔














3.載入圖片













Load 影像至Image1、偵測影像的位元值、Transform Button設定為可使用



4-1. 開始轉換












顯示出轉換進度(一開始適用來Debug),Transform Button設定為不可使用


4-2.轉換中












加了一行Application->ProcessMessages();
讓程式不會有不回應的狀況,畫面從左而右依序轉出


5.轉換完成













轉換完成彈出Messeage視窗提示


6.Save影像













在Messeage視窗按下確定後,進度條恢復隱藏、Save為可使用、Reset Button顯示

此時若選擇Open載入影像,則會回到第三張截圖的狀態 (包含Save Disable、Display Transform Button、Image2 Clean)


7. 儲存的灰階圖檔











選擇Save後,會產生出一個Gray.bmp的灰階影像




另外以這張貓咪的Image為例,實際影像大小為480 x 360
而載入Image1的方框時,設定縮放80%(384 x 288)
在轉換時則須依照原影像大小操作
因此在轉換的過程中,灰階圖片會比原圖片來的大
若鎖定Image2方框大小(AutoSize為false),轉換後的影像會被裁切;
若設定AutoSize為True,轉換過程Image2的方框會擴大
因此拉了一個ScrollBox來放Image2,順利解決這個問題
但還是想要嘗試看看在轉換的過程中,能否直接同步顯示出縮放的影像,
而不用等到轉換完成後再縮放,不知道能用什麼方法達成?

2009年10月8日 星期四

HW1

第一次使用BCB但對介面化程式設計不陌生
因高中學習過VB,所以在撰寫BCB上比較沒有問題並且可以快速進入狀況
不過在轉移到其他電腦要開啟project的時候有點問題
save的時候project、code都有存到
不過從找不到package上來看,應該是lib、bpl沒有複製到
不知道除了帶著Lib跑外,有沒有其他的解決辦法?


相較於VB與BCB,除了介面中英文的差異外
BCB是C++的一種,因此撰寫格式會相近於C++的模式
所以對我來說初次體驗BCB的感覺便是在VB裡面寫C++ ~


第一次作業牛刀小試
撰寫步驟不複雜,沒有什麼問題
但是開檔讀檔過去VB比較沒有操作,因此我還蠻有興趣的


首先建立一個MainMenu來開啟Image檔案
以OpenPictureDialog彈出開啟檔案的方框
這裡我配合if做是否成功開啟的判斷
預防說開啟的檔案有問題或是按取消造成的程式中斷
接著以LoadFromFile將選擇的檔案路徑assign給Image元件顯示讀入的BMP


然後第二部分
以Events設定當滑鼠移過Image時要顯示出以下資訊
指標於Image內的X,Y座標還有該位置的R,G,B色彩值分析
這步驟也很容易,座標利用MouseMove預設好的X,Y引數
而讀取R,G,B數值也有內建的function可以呼叫使用
再把讀到的值透過Label來顯示即可


第三部分是繪圖的處理
因為過去沒有處理過類似的功能,一開始還擔心會很麻煩
這回就讓我見識到了,BCB強大的元件組,可以叫出調色盤
而UI的程式書籍一定會提到的畫圖功能也是第一次嘗試
(過去根本用不到畫圖,也沒想過要用,不管是畫圓、畫線、畫曲線)
用Events的滑鼠Click來撰寫左鍵直線起點,右鍵終點
然後Button Color則call出調色盤來改Pen color



以下是程式執行畫面
開啟圖檔 : File > Open
click滑鼠左鍵定位 、 click滑鼠右鍵拉線
























然後點Color可以變換色彩






















完成作業的要求後,另外自己加了點東西
當指標由Image元件移動出了元件後
Label顯示的資訊會留下在元件內時的資訊
就想順手改看看讓指標出了Image方框資訊就消失

做法也很簡單不用多做考慮,反向思考推說
當指標離開Image元件就是進入Form內
那只要指標進入Form時依樣畫葫蘆以MouseMove處理讓Label變空值

compile後一run
就如預期的一樣,成為一個比較合乎直覺邏輯的程式~
然後就Click自己建立的Exit Button關閉程式囉

以上~ 另外我覺得BCB的程式不大穩定,有時候會不知名的失控....