我覺得我在這學期的這門課還算挺有收穫的,
在這學期我學到了關於處理圖檔(BMP和JPG)和聲音檔的學問,
不只是了解了這些多媒體檔案的格式內容及來龍去脈,
也親自動手寫了程式去做讀取、展現及相關操作,
讓我的程式功力更上一層樓,因此我覺得這學期我還算挺有收穫的。
不過我一直覺得我還學得不夠,雖然在多媒體這塊學到的還算廣
(學了BMP、GIF、WVA)有了影像及聲音,
如果再加個動畫那就幾乎可以涵蓋多媒體了,
不過我目前還學的不夠深入,有點學了很多卻只學到了毛皮的感覺,
未來出去找工作如果只會寫"讀取BMP檔"的程式?
或是"畫出GIF檔的調色盤"?不夠吧?
當然我也清楚一學期18周最多54個小時,
老師能教的,學生能吸收的,都很有限。
如果老師教太快,學生恐怕會沒辦法負荷;
老師教太慢,能學到的東西又太少,真是進退兩難阿!
不過俗話說:師父引進門,修行靠個人。
這句話一點也不假,老師不可能再有限的時間裡把所有的知識傳授給我們
,就算能辦到我們能不能學會又是另一回事阿!
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++)
我的作業除了印出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]));
}
雖然寫完這程式我知道這可能會與老師的要求不太一樣,
不過我想概念應該差不了太遠才對,就跟圖檔一樣,
除了檔頭部分其他的資料應該就是該圖片的內容,
我們為了要真正看到圖片所長的樣子,才會利用撰寫程式以不同的方式來展現該檔案。
我寫程式時一向很喜歡用很直覺的方式去思考,
反而不太喜歡用內建的函數及物件等等,因為如果是第一次使用的話,
八九成都不太會用,甚至可以說完全不會用!
一定要去查資料來好好熟悉一番,如此才能用的得心應手;
不過其實這也不能說是不喜歡拉,因為有了這些函數及物件等,寫起程式來真的是事半功倍,
畢竟這樣才有利於大型程式的發展阿。
假如沒有這些高階語言,而用類似像低階的組合語言寫(?!)會瘋掉吧。
Memo3->Lines->Add(AnsiString(data[0]));
}
雖然寫完這程式我知道這可能會與老師的要求不太一樣,
不過我想概念應該差不了太遠才對,就跟圖檔一樣,
除了檔頭部分其他的資料應該就是該圖片的內容,
我們為了要真正看到圖片所長的樣子,才會利用撰寫程式以不同的方式來展現該檔案。
我寫程式時一向很喜歡用很直覺的方式去思考,
反而不太喜歡用內建的函數及物件等等,因為如果是第一次使用的話,
八九成都不太會用,甚至可以說完全不會用!
一定要去查資料來好好熟悉一番,如此才能用的得心應手;
不過其實這也不能說是不喜歡拉,因為有了這些函數及物件等,寫起程式來真的是事半功倍,
畢竟這樣才有利於大型程式的發展阿。
假如沒有這些高階語言,而用類似像低階的組合語言寫(?!)會瘋掉吧。
2010年1月15日 星期五
HW5
這次的作業呢是把GIF影像讀取印出並且把GIF的調色盤畫出,
雖然這次的作業一樣是跟影像的讀取有關,不過前面四次都是BMP檔,
而這次是讀取GIF檔,並且與BMP檔不太一樣的是GIF檔有調色盤,
所有會用到的顏色都會在調色盤上。
GIF最大的優點就是檔案不大,極適合在網頁上應用,
要是圖檔太大開啟一個網頁上的圖可是要等一段時間的,當然誰都不喜歡等。
不過其缺點是影像品質不太好,原因之一就是該圖最多也只有256色,
因此這並不適合在拍照上應用。
寫程式的部分我參考了老師的程式碼,不過也因為這是老師寫的,
有些地方看的不是很懂,比如像是個個變數所代表的意義等等,
而老師的程式中也用了不少的變數呢。
在畫調色盤的程式部分,程式架構就是用兩個迴圈去做,
就像之前讀取BMP檔,搭配fread與fseek使用,把讀到的像素點給一一印出;
讀取GIF調色盤也類似,把讀到的顏色畫出來,並把他畫成一個一個的方塊,
方塊與方塊間還可以留點空白好辨識;
再來調色盤畫好後還可以去按照顏色的明亮度或RGB值等等去做由小到大或由大到小的排序。
我覺得這次作業跟前面幾次比起來會比較困難些,因為還不熟悉GIF檔的格式,
雖然老師講得還滿清楚的,不過可惜的是老師講解與討論上只有一到二的禮拜,
花的時間也有點少,有點可惜,也讓我有點來不及吸收,
不過在聽老師的講解中其實我覺得GIF檔並不會比BMP來的多複雜,
只要再多花點時間去研究我有把握我能學得很好。
雖然這次的作業一樣是跟影像的讀取有關,不過前面四次都是BMP檔,
而這次是讀取GIF檔,並且與BMP檔不太一樣的是GIF檔有調色盤,
所有會用到的顏色都會在調色盤上。
GIF最大的優點就是檔案不大,極適合在網頁上應用,
要是圖檔太大開啟一個網頁上的圖可是要等一段時間的,當然誰都不喜歡等。
不過其缺點是影像品質不太好,原因之一就是該圖最多也只有256色,
因此這並不適合在拍照上應用。
寫程式的部分我參考了老師的程式碼,不過也因為這是老師寫的,
有些地方看的不是很懂,比如像是個個變數所代表的意義等等,
而老師的程式中也用了不少的變數呢。
在畫調色盤的程式部分,程式架構就是用兩個迴圈去做,
就像之前讀取BMP檔,搭配fread與fseek使用,把讀到的像素點給一一印出;
讀取GIF調色盤也類似,把讀到的顏色畫出來,並把他畫成一個一個的方塊,
方塊與方塊間還可以留點空白好辨識;
再來調色盤畫好後還可以去按照顏色的明亮度或RGB值等等去做由小到大或由大到小的排序。
我覺得這次作業跟前面幾次比起來會比較困難些,因為還不熟悉GIF檔的格式,
雖然老師講得還滿清楚的,不過可惜的是老師講解與討論上只有一到二的禮拜,
花的時間也有點少,有點可惜,也讓我有點來不及吸收,
不過在聽老師的講解中其實我覺得GIF檔並不會比BMP來的多複雜,
只要再多花點時間去研究我有把握我能學得很好。
HW6

這次的作業目的是讀取音樂(.wav)檔的內容,內容包括了檔頭、檔案大小、聲道數、每秒取樣數(其實就是頻率)
還有音訊格式。程式的部分首先要開啟音樂檔,用OpenDialog,然後再把資料結構為FILE的指標使用fseek設定一下:
fseek ("FILE變數名稱","位置",SEEK_SET);
設定完後再使用fread去讀取:
fread("變數名稱", 1, "讀幾個位元","FILE變數名稱");
再來印出:
Edit1->Text = AnsiString("變數名稱");
接下來一樣再繼續重新設定指標指到的位置、讀取、印出....
基本上這次的作業我沒遭遇到甚麼大困難,不過在蒐集檔案的相關資料、格式上倒是花了一點時間 ,這還挺重要的,為了要決定指標指到的位置,以及指到後該以何種變數去存放它。
例如檔案大小我用unsigned int去存(其實BYTE也行不過讀到後還要經過公式a[0]+a[1]*256+a[2]*256*256...的轉換)
檔頭的RIFF我就用字串去存,聲道數我用BYTE存。
其實這次的作業還跟之前讀取BMP檔頗類似的,一樣都是讀取檔案內的一些資訊。
還有音訊格式。程式的部分首先要開啟音樂檔,用OpenDialog,然後再把資料結構為FILE的指標使用fseek設定一下:
fseek ("FILE變數名稱","位置",SEEK_SET);
設定完後再使用fread去讀取:
fread("變數名稱", 1, "讀幾個位元","FILE變數名稱");
再來印出:
Edit1->Text = AnsiString("變數名稱");
接下來一樣再繼續重新設定指標指到的位置、讀取、印出....
基本上這次的作業我沒遭遇到甚麼大困難,不過在蒐集檔案的相關資料、格式上倒是花了一點時間 ,這還挺重要的,為了要決定指標指到的位置,以及指到後該以何種變數去存放它。
例如檔案大小我用unsigned int去存(其實BYTE也行不過讀到後還要經過公式a[0]+a[1]*256+a[2]*256*256...的轉換)
檔頭的RIFF我就用字串去存,聲道數我用BYTE存。
其實這次的作業還跟之前讀取BMP檔頗類似的,一樣都是讀取檔案內的一些資訊。
2009年11月26日 星期四
HW4
在這次的開BMP圖檔的作業中,是要以C語言中檔案存取的指令(fopen,fread,fseek...)來開啟,
而不是使用c++builder裡所內建的Image1 -> Picture -> LoadFromFile...來開檔。
我們在之前的作業三當中已經利用fopen,fread,fseek指令來讀取圖檔資訊(檔案大小,圖片高寬等等)
若想要將影像秀出螢幕上,我們勢必要先讓fseek指標指到影像原始碼的位置(原始碼的部分可由PSPad這套軟體來檢視),
然後再用fread去讀,我們讀到的東西會先擺入一個陣列中,陣列有3個空間分別來擺放色彩R,G,B值,而這RGB值就可以表示一個像素"點",不過程式只這樣寫還不夠,如此讀到的只有一個像素點而已,因此我們必須要用兩個迴圈來寫,外迴圈是跑圖的高的部分,內迴圈是跑圖的寬的部分,而程式的大鋼就是如此。
在這次的作業中,fopen,fread,fseek這些指令經過前面幾次的練習都熟悉的差不多了,沒有甚麼大困難
,而比較會有問題的地方大概會在讀檔時該用怎樣的讀法?一次讀幾個byte?讀到的東西該暫存到怎樣的資料型態?然後在怎樣丟入image中?丟完後指標該怎麼指?
基本上這些問題排除了,那程式也差不多會寫了,其實程式還滿短的,自己寫完後也覺得不算太難!
2009年11月5日 星期四
HW3
首先先顯示這張bmp檔的內容,再來利用程式把該bmp檔開啟舊檔後,
5個label分別秀出了BM,代表了bmp檔的檔頭字元;
再來是246 35 5 0則代表了該圖檔的大小,不過真正要表示大小還必須經過以下運算:
圖檔大小=246+35*256+5*256*256+0*256*256*256=336886(byte)
換成程式寫法:
FileSize = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;
經過運算後label上的FileSize就正好=336886
接著FileWidth和ilmageHeight分別代表圖檔寬度和高度。
接著FileWidth和ilmageHeight分別代表圖檔寬度和高度。
在這次的作業中,其實主要會開檔(fopen),讀檔(fread),秀出BM..來這次作業就沒有甚麼大問題,不管你要秀出BM,檔案大小,寬,高...程式寫法根本沒甚麼兩樣唯一不同的是要設定指標指到的位置(使用fseek),至於要指到哪裡可經由查表得知!
2009年10月21日 星期三
2009年10月6日 星期二
2009hw1
訂閱:
文章 (Atom)