2010年1月16日 星期六

HW7


這個程式大概是我寫過最瘋狂的的程式之一吧!

我的作業除了印出wav檔頭的資訊外,還新增了一個印出wav波形的功能,
這個波形是我用字元符號"."和"●"去畫的,也因為如此看起來不太好看,
不過這不是重點,重點是這波形到底代表的是甚麼呢?
其實我還不太清楚...((眾歐

說穿了我只是把該wav檔的內容以不同的資料型態去存,
上圖左邊以BYTE資料型態去存,
右半邊以unsigned int去存(存到的數很大)。

接著為了把它以"波形"的樣貌顯示,
我把BYTE變數再減230(實際上大約等於250左右)並印到Memo1上,
波形的話我用AnsiString資料型態用迴圈去累加"."這個符號,
加完後再累加一個"●",如Memo2上所顯示;

再來我又以不同的資料形態去存(unsigned int),
因為存到的數實在太大了,為了要方便顯示波形,
我把unsigned int這變數取4294000000的餘數,再除以10000(會減少4位數),
大概就等於0~100之間(實際上約等於4294000000~4295000000),
接著最後印出波形的部分也跟前面提到的一樣。

以下是我的部分程式碼:

for(int i=0;i<="尾";i++)
{
AnsiString str="";
fseek (ptr,"頭"+i*4,SEEK_SET);
fread(data, 1, 4, ptr);
data[0]=data[0]%4294000000;
data[0]=data[0]/10000;
for(int j=0;j<=data[0];j++)
{ str=str+".";
}
str=str+"●";
Memo4->Lines->Add(AnsiString(str));
Memo3->Lines->Add(AnsiString(data[0]));

}

雖然寫完這程式我知道這可能會與老師的要求不太一樣,
不過我想概念應該差不了太遠才對,就跟圖檔一樣,
除了檔頭部分其他的資料應該就是該圖片的內容,
我們為了要真正看到圖片所長的樣子,才會利用撰寫程式以不同的方式來展現該檔案。
我寫程式時一向很喜歡用很直覺的方式去思考,
反而不太喜歡用內建的函數及物件等等,因為如果是第一次使用的話,
八九成都不太會用,甚至可以說完全不會用!
一定要去查資料來好好熟悉一番,如此才能用的得心應手;
不過其實這也不能說是不喜歡拉,因為有了這些函數及物件等,寫起程式來真的是事半功倍,
畢竟這樣才有利於大型程式的發展阿。
假如沒有這些高階語言,而用類似像低階的組合語言寫(?!)會瘋掉吧。



HW5







這是第5次的作業了,這次的作業是開啟一張GIF圖片後,在讀出檔案中的調色盤資料,接著把調色盤裡的色塊做排序!這次也是有開啟PsPad查看了一下GIF裡的檔案格式,查出他的標頭檔資料等內容,看法大致上跟看BMP檔沒什麼太大差別,多了很多RGB資料。GIF圖片檔案老師之前有用一節課的時間,和我們討論維基百科上的解說,中英比對看,對於GIF圖片格式也有更多的了解,GIF圖片最多只能有256色,支持每像素8位元,適合做網頁的動畫等等。在調色盤排序的方面則是將下面這段RGB(crPalette[k].bRed + crPalette[k].bGreen + crPalette[k].bBlue)/3所讀出的值,用Bubble Sort的排序方式將其色塊比較大小由暗到亮依序排好,排好之後也就完成!

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的效果~

言歸正傳



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

HW4


這次作業跟作業三有異曲同工之妙,這是要我們用frpen fread fseek開啟BMP檔,目的是把圖一個個放進檔案元件內,而不是用LoadFromFile,相較之下難度有增加,看了看老師的飯粒程式,似乎有一點點的了解,以下三行是要再多加到程式碼裡面,
bPtOriginalImage[j*3+2]=ctColor[0].bRed
bPtOriginalImage[j*3+1]=ctColor[0].bGreen
bPtOriginalImage[j*3]=ctColor[0].bBlue
感覺起來這三行像是在寫三原色,才知道是用來把RGB資料寫入影像元件中,還需要用到PSPAD來找出原始檔,PSPAD雖然在資料結構中有用過,但是沒有很熟悉他,原來PSPAD的功能這麼強,隨著作業的次數增加感覺程式越來越難了,加上BCB算是第二種程式,也只能盡力把他學好了。

HW5

其實打這次程式真的很累,不過其實也是自作自受,因為當初這堂課我把他翹掉窩在圖書館讀工數,結果沒上課的心理作祟作業也懶得去做,只稍微試了老師PO的第一版範例程式弄了半小時就放棄了,後來也沒時間管HW5,終於今天忙完期末考和專題報告花了一整個晚上寫HW5,還發現原來老師的範例程式老早就改版了,好寫很多!
不過我拿到改版的程式碼把一些元件拉完之後還是發現一堆錯誤,剛開始卡最久的大概是crPalette[i].bRed=0 ,我一直搞不懂bRed是怎麼去定義的,先去參考了之前灰階的調色盤發現沒幫助,決定先找找看Blog上其他同學有沒有碰到類似問題,其實大部分同學的hw5我都有稍微看過,發現大家還滿神的...原來只要稍微改一下元件的名稱然後用sort就行了?
不過終於發現有實際做的同學有跟我一樣的問題,參考了簡呈恩的方法後終於知道還要自己去一些定義結構才能使用老師的程式碼。
先把Label拉一拉和定義一些未定義的變數後,終於讓大部分的程式碼都可以跑,我才慢慢看每段程式碼,發現讀標頭檔那段有些我實在看不懂,類似 bCR=bCR >> 5; bCR=bCR+1; 這種 >>是什麼意思呢??
後來卡最久的其實是排序,因為看到老師有定義 float fLuminance[256]; 這變數來放色彩亮度,我直覺用這個來當做色彩亮度比較然後排序就可以了,沒想到怎麼排都不對,後來想到要排256次於是很開心設了迴圈馬上跑跑看,結果還是一樣...
不過很扯的是,我用了老師另外定義的crSortedPelette(拿來複製原本crPelette的RGB)  
然後用(crSortedPelette[k].bRed+crSortedPelette[k].bGreen+crSortedPelette[k].bBlue)/3)來比較大小,這個我覺得不夠聰明的方法竟然就正確排序了? 老師設fLuminance還特地幫我們算出色彩亮度不就要方便拿來比較亮度嗎?
結果發現是我自己比較亮度之後只swap了crSortedPalette忘記交換fLuminance(在打完上面後突然想到 哈哈...),試過之後就成功能使用fLuminance這方法了,好吧,所以老師幫我們寫的一個好用的fLuminance來比較亮度!! 哈哈~~
在全部寫完之後載入金龜的圖才發現顏色不對?? 後來才發現原來是RGB位置放錯,一定是老師故意改錯要讓我們改 哈!

接下來就是展現成品的時候了!!

(1)讀取金龜圖



(2)讀取小畫家轉成GIF的圖檔





上面這兩張明明是不同的圖檔但是為什麼色盤都一樣?? 難道是小畫家轉成GIF都用一樣的色盤嗎? 這是我自己的猜測~~

(3)讀取用專業轉圖軟體轉換的GIF檔


一切正常~完美!! 終於在凌晨三點做完HW5了~~ 開心阿!! 可以安心睡覺了!!!




HW5

利用老師提供的程式碼
要讀取GIF調色盤
先從typedef下手,把要用到的變數都加到標頭檔
GIF的版本,長寬還有色塊等

第一次我寫這程式的時候
執行結果跟老師給的執行結果不一樣...





















整個顏色都不一樣阿!!!!!!
然後就EMAIL問老師
老師說:


"你可以把讀到的色彩顯示出來,


再用 PSPad editor 看是不是讀正確了"
 
 
...
我大概是聽不太懂老師的意思
已經顯示出顏色了阿!!!
 
後來上課再問老師
原來是要把讀到的顏色的"值"顯示出來
比如說(255,255,255)是白色那樣
我就在程式底下加了一小段東西
看一下最前面幾個顏色
再比對一下正確的數值
果然!!是讀取到錯誤的數字
 
我沒有注意到GIF的色塊是"R->G->B->"這樣一直下去的
不像BMP那時候的4BYTE
會讀錯是因為我偷懶
直接把BMP的color struct給GIF用...
好吧 只好再生一個GIF專屬的調色盤
 
然後就成功了!!!
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


後來我也想要在程式上直接秀出整張GIF圖檔
看到部落格裡有人也想這麼做
可是他有提到要用到什麼元件之類的
就暫時不研究了!
 

2010年1月15日 星期五

HW5

這次的作業呢是把GIF影像讀取印出並且把GIF的調色盤畫出,
雖然這次的作業一樣是跟影像的讀取有關,不過前面四次都是BMP檔,
而這次是讀取GIF檔,並且與BMP檔不太一樣的是GIF檔有調色盤,
所有會用到的顏色都會在調色盤上。

GIF最大的優點就是檔案不大,極適合在網頁上應用,
要是圖檔太大開啟一個網頁上的圖可是要等一段時間的,當然誰都不喜歡等。
不過其缺點是影像品質不太好,原因之一就是該圖最多也只有256色,
因此這並不適合在拍照上應用。

寫程式的部分我參考了老師的程式碼,不過也因為這是老師寫的,
有些地方看的不是很懂,比如像是個個變數所代表的意義等等,
而老師的程式中也用了不少的變數呢。

在畫調色盤的程式部分,程式架構就是用兩個迴圈去做,
就像之前讀取BMP檔,搭配fread與fseek使用,把讀到的像素點給一一印出;
讀取GIF調色盤也類似,把讀到的顏色畫出來,並把他畫成一個一個的方塊,
方塊與方塊間還可以留點空白好辨識;
再來調色盤畫好後還可以去按照顏色的明亮度或RGB值等等去做由小到大或由大到小的排序。

我覺得這次作業跟前面幾次比起來會比較困難些,因為還不熟悉GIF檔的格式,
雖然老師講得還滿清楚的,不過可惜的是老師講解與討論上只有一到二的禮拜,
花的時間也有點少,有點可惜,也讓我有點來不及吸收,
不過在聽老師的講解中其實我覺得GIF檔並不會比BMP來的多複雜,
只要再多花點時間去研究我有把握我能學得很好。

HW8

很快的這學期的課程就這樣結束了,想當初一開始搞不大董BCB這個平台,過了一學期雖然可以完成一些簡單的程式,但依舊是不大熟悉,首先BCB這個平台我認為比C++親民一些,畢竟用多了許多可以用圖形完成的東西,這在學了一年半的C++後可以說是在程式設計上喘了一口氣,再來就是在上課的過程當中,依舊是很有老師風格的輕鬆氣氛,除了老師講解以外,還給了我們時間查資料以及討論,基本上就是讓會的同學可以教不會的同學,這跟其他本科系的科目實在是不大一樣,另外就是老師上課的內容其實滿有條理的,這在學習程式設計上有很大的幫助,因為上過其他一些老師,上課的時候真的非常的跳躍,有些地方真的是不大了解,基本上在這學期的課程當中也補齊了一些之前沒學好的基本功,其實到了最後幾堂課老師開始討論起了這學期課本的問題,其實我覺得這本課本的內容很剛好,在學C++的過程當中我也買過一本比較小的,結果內容真是非常的精簡,在做基本練習的時候雖然都可以應付,但到了進階的狀態下,就稍為無法獲得想要得知的資訊,這學期的課本厚雖厚,但是就像字典一樣,危急時刻就是有辦法在裡面找到幫助,另外就是這學期的作業,真的可以說是循序漸進,一開始真的還滿簡單的,隨隨便便就可以秒殺,但到了第四次作業之後突然感受到了這門科目的難度,雖然可以解決,但卻覺得時間有點緊迫,如果真的要說缺點的話大概就是最後幾次作業的時間有點趕,會讓人消化不良,除此之外真的沒有什麼大問題


謝謝老師這學期的教導

HW7

這是這學期最後一個作業了,對我來說還是有點困難
有努力想把他想好
但才知道之前部會得太多還是無法獨力完成他
老師要的是聲音越大y軸的起伏就越大
反之則越小
在網路上找了很久都沒看到有人討論音量的修改方式
但是看了那些這麼困難的程式碼我又不太會
這次的程式對我來說算是非常艱難的
因為看了許多同學們的程式並研究
哪些函數是做什麼的也不知道
但是就照著他們的做法去實作自己還是不會
可能自己的程式功力要再加強吧

HK7

這一次做的是把音樂的聲音可以撥放且能調大小
在做了這之前
要能調音量大小之前就必須先把音樂能做正常的播放
當然先從書裡面找有關多媒體的播放來看
當先逐一打完程式之後不知道為什麼就是怪怪的~~





在每次要開始執行按了F9之後就會出現這一串奇怪的警告訊息
就是不知道為什麼?不過還是可以繼續執行也是令我覺得不可思議的地方














1.將音樂檔案開起來















2.播放時的畫面~~














3.當按暫停的時候的畫面

雖然調音量大小從上課中知道他的值去除就可以間接的控制到音量大小
試了半天就是怪怪的怎麼是怎麼錯~~~
在這一個做的音樂播放程式中~~~
雖然可以聽到音樂可以正常的播放出來~
不過也試了好幾種寫法...
試到其中一次進然說我的數值不對
跟顯是錯誤說不是正確的寫法="=
讓我弄到還蠻煩的....XD
不過現在做的播放程式中...
音樂雖然可以播放
不過在聽的時候會出現小瑕疵
就是音樂有點像LAG般
一直頓一直頓...
不過拉ScrollBar也可以跳到指定播放的地方
只是還是會頓頓的~就是不知道為什麼?