第七次的作業是要撰寫一個可以處理音訊的程式,像是修改聲音大小的功能。 之前聽老師說把裡面的值除以2再放回去,就能將音量變小。初步認為WAV檔在檔頭記憶體45之後是存放所有有關音檔播放的內容,所以應該是會有存放有關音量大小的控制,但卡在程式不知如何開始寫,不知道該如何下手。剛開始的時候還以為好像不會很難,但實際操作後發現還真的不是那麼一回事啊。或許沒有老師的範例程式,就沒有方向了,慚愧呀。
這一次的作業真的不容易,也在google上爬了好久的文,也找到了這個 控制音量 ,但是試著照上面的說明來打,還是沒有成功,目前我的程式是卡在未定義的"waveOutGetVolume" 和 "waveOutsetVolume" 。 應該是先要設立一個標頭檔,可是不知道該用哪個。
如果能將這個程式完成的話,就好像我自己完成了一個小型的播放程式,之後我會再利用時間來研究看看 如何來修改聲音的大小,現在只能先打上我作這個作業所碰到的遭遇和心得囉。
2010年1月16日 星期六
HW5
這是我目前花最久的作業了,之前的作業都是有關於BMP圖檔的讀取,這次的作業換成了讀取GIF的圖檔,照慣例先從wiki中吸收有關於GIF圖檔的資訊,GIF主要分為兩個版本,即GIF 87a和GIF 89a,這不像其它死板板的圖片,是可以支援動畫的形式。
接著利用老師的範例程式,先補上老師範例程式該有的標籤,每個對應顯示出來的是GIF的檔頭資料,這是在wiki上查到的檔頭資料:
接著還要定義結構來存放檔頭的資料,例如這樣
typedef struct {
char cVersion[6];
Byte bScreenWidth[2];
還有一些<<和>>的,例如這個 bM = GIFHeader[0].bMCrPixel >> 7; 搞不太懂耶,希望老師能解釋囉。
最後是使用 crSortedPalette[k].bRed+crSortedPalette[k].bGreen+crSortedPalette[k].bBlue)/3
來比較大小。
順利做出來後,發現出來的結果跟老師放在網頁的圖片不一樣,後來詢問過同學後,將我原本的RGB順序改成 現在的BGR就會有跟老師一樣的結果了。
imPalette->Canvas->Brush->Color =(TColor)RGB(crPalette[k].bBlue,crPalette[k].bGreen,crPalette[k].bRed);
這是之前的結果:
大功告成~~之後就是我的完成品:

我的排序是從亮到暗
不過我發現有一個點顯示不太一樣,有一個特別的點,是紅色的,你們有發現嗎?
不知道為什麼會這樣耶。

開其它圖片來玩玩~~

接著利用老師的範例程式,先補上老師範例程式該有的標籤,每個對應顯示出來的是GIF的檔頭資料,這是在wiki上查到的檔頭資料:
接著還要定義結構來存放檔頭的資料,例如這樣
typedef struct {
char cVersion[6];
Byte bScreenWidth[2];
還有一些<<和>>的,例如這個 bM = GIFHeader[0].bMCrPixel >> 7; 搞不太懂耶,希望老師能解釋囉。
最後是使用 crSortedPalette[k].bRed+crSortedPalette[k].bGreen+crSortedPalette[k].bBlue)/3
來比較大小。
順利做出來後,發現出來的結果跟老師放在網頁的圖片不一樣,後來詢問過同學後,將我原本的RGB順序改成 現在的BGR就會有跟老師一樣的結果了。
imPalette->Canvas->Brush->Color =(TColor)RGB(crPalette[k].bBlue,crPalette[k].bGreen,crPalette[k].bRed);
這是之前的結果:
我的排序是從亮到暗
不過我發現有一個點顯示不太一樣,有一個特別的點,是紅色的,你們有發現嗎?
不知道為什麼會這樣耶。
開其它圖片來玩玩~~
2010年1月15日 星期五
HW6
wav檔前面的44個byte是檔頭,紀錄著有關此wav的資料
以下是我在網路上找到的介紹
1 0...3 str4 "RIFF" in ASCII 存放的是RIFF字串
2 4...7 int4 Total bytes minus 8 存放的是資料區塊大小
資料區塊大小=(檔案大小-8)
3 8...15 str4 "WAVEfmt" Eigth character is a space 存放的是WAVE字串、子區塊識別名
4 16...19 int4 16 for PCM format 存放的是子區塊大小
5 20...21 int2 1 for PCM format 存放的是聲檔格式,0x0001表PCM格式
6 22...23 int2 channels 存放的是聲道數
7 24...27 int4 sampling frequency 存放的每秒取樣數
8 28...31 int4 bytes per second 存放的是每秒資料量
每秒資料量=(聲道數*位元數*每秒取樣數/8)
9 32...33 int2 bytes by capture 存放的是子區塊位元組
子區塊位元組=(位元數/8)
10 34...35 int2 bits per sample 存放的是取樣位組元數
11 36...39 str4 "data" 存放的是data字串
12 40...43 int4 bytes in data 實際聲檔大小,這個值為檔案大小減去檔頭(44BYTE)後的值
有了這些資料後就能開始寫程式了,寫法大致上跟之前讀BMP檔的標頭差不多,不過在這次作業使用了unsigned int 的方式,好用許多,不用像之前要使用一長串的程式碼才能讀出,看起來也比較簡潔一點。我只取出一些我比較有興趣的8個檔頭資料,剛開始第一個和第二個在顯示時會跑出一些亂碼出來,後來查資料,在不要的後面加上NULL,就不會取到RIFF和WAVE後面的亂碼了,這是我程式其中一個取檔案大小的程式碼:
fseek(imWAV,4,SEEK_SET);
fread(c, 1, 4, imWAV);
iFileSize = c[0];
Label4->Caption=("File Size="+AnsiString(iFileSize + 8));
會了之後,其它的也就不難了。最後能讓音樂能在BCB上播放,要再加上
MediaPlayer1->FileName=OpenDialog1->FileName;
MediaPlayer1->Open();
MediaPlayer1->Play();
另外上網查了一下有關音訊波形的顯示,目前找不太到,看看有誰能夠教我如何做出來吧。
HW4
這次的作業是讀取一張 BMP 影像,將影像內容顯示於影像元件裡。
利用老師給的範例程式來完成這次的作業,因為老師都有上註解,所以讀起來也會比較容易了解。比較好奇的是程式最後要 unsigned char ucFileEnd[2]; 宣告 2 個變數,我想應該是在存成 bmp 檔時, 每一行最後會補上 2 bytes。也正如老師所講的是 4 的倍數的彩色影像,我覺得應該是這樣的解釋。
然後這程式是使用OpenPictureDialog1->Execute();的開檔方式,再讀圖片的每一個點並將其顯示出來,這是這一部分的程式碼
for(j=iImageHeight;j>0;j--)
for(i=0;i
{
fseek (imBMP,offset,SEEK_SET);
fread (bSize, 1, 3, imBMP);
offset+=3;
Image1->Canvas->Pixels[i][j]=(TColor)RGB(bSize[2],bSize[1],bSize[0]);
}
2010年1月14日 星期四
HW8
這門「數位媒體概論」課,上了一學期了,終於也到學期結束的時候。 剛開始選了這門課,會覺得「數位媒體」想必會是個非常有趣的東西,因為在平常也很常接觸到,像是音樂、圖片和影片等。所以我覺得應該會像寓教於樂一樣,學得很輕鬆。
因為這門課叫做數位媒體概論,當初以為這會是偏向理論的概論課,不過上完之後,跟我原本想像的完全不一樣。除講講理論,上google看看所要教的內容外,還要用BCB來撰寫程式。 (題外話 : 上了大二後,寫程式好像全都使用BCB這套軟體,跟資料結構一樣,寫出來的執行檔比較親民,不像大一學的是使用像DOS的介面,不過也因此要多熟記BCB裡元件的使用方法。) 因此老師也要我們訂了一本我們俗稱聖經的 "C++ Builder 6完全攻略"工具書,裡面完整寫了有關BCB元件的介紹及使用方法,讓我們在使用BCB這套軟體時能夠得心應手,不過向對我這種程式能力不是很厲害的人,要多花心思才能理解老師教的內容。
開始上課後,老師先讓我們了解有關BMP圖檔的說明,上過之後才叫真正知道有關數位媒體的東西,原來有關檔案的資料都存放在檔頭的資料庫裡,資料庫裡存放了有關圖片的資料。所以老師就要我們用BCB去讀出這些檔頭的資料,每個資料都有對應的記憶體位置,像是size大小、長寬等。之後再進階去找出圖片的X和Y值,還有圖片顏色的RGB值,在圖上畫線和換顏色等,感覺就很像在作一個屬於我的小畫家。 後來又教如何使用fopen、fseek和fread的指令,從剛開始完全不會到現在可利用指令來查詢所要的東西,感覺很棒。
我覺得老師的教學很不錯,會和學生互動並且和我們來討論一些東西和老師教學的方向,該如何可以讓學生學的更好。雖然我不敢說老師教的我完全都吸收了,不過也像老師所說的,學程式必須要自己弄懂其含意,要身體力行 ! 我會將此話放在心裡頭,來警惕自己的。
因為這門課叫做數位媒體概論,當初以為這會是偏向理論的概論課,不過上完之後,跟我原本想像的完全不一樣。除講講理論,上google看看所要教的內容外,還要用BCB來撰寫程式。 (題外話 : 上了大二後,寫程式好像全都使用BCB這套軟體,跟資料結構一樣,寫出來的執行檔比較親民,不像大一學的是使用像DOS的介面,不過也因此要多熟記BCB裡元件的使用方法。) 因此老師也要我們訂了一本我們俗稱聖經的 "C++ Builder 6完全攻略"工具書,裡面完整寫了有關BCB元件的介紹及使用方法,讓我們在使用BCB這套軟體時能夠得心應手,不過向對我這種程式能力不是很厲害的人,要多花心思才能理解老師教的內容。
開始上課後,老師先讓我們了解有關BMP圖檔的說明,上過之後才叫真正知道有關數位媒體的東西,原來有關檔案的資料都存放在檔頭的資料庫裡,資料庫裡存放了有關圖片的資料。所以老師就要我們用BCB去讀出這些檔頭的資料,每個資料都有對應的記憶體位置,像是size大小、長寬等。之後再進階去找出圖片的X和Y值,還有圖片顏色的RGB值,在圖上畫線和換顏色等,感覺就很像在作一個屬於我的小畫家。 後來又教如何使用fopen、fseek和fread的指令,從剛開始完全不會到現在可利用指令來查詢所要的東西,感覺很棒。
我覺得老師的教學很不錯,會和學生互動並且和我們來討論一些東西和老師教學的方向,該如何可以讓學生學的更好。雖然我不敢說老師教的我完全都吸收了,不過也像老師所說的,學程式必須要自己弄懂其含意,要身體力行 ! 我會將此話放在心裡頭,來警惕自己的。
2009年11月5日 星期四
HW3


原本交的作業,不夠用心,也不是老師要的方式。經過老師對我們作業的檢討,了解到很多東西,甚至到了將來,有一份22K的工作要不要做,其中也有需多涵意有待我們省思。
這次是將圖檔的資料由ShowMessage改放在Label上,因為Vista的BMP內容沒有顯示水平和垂直解析度,因此補上jpg的內容圖。
這次的作業也讓我們練習了fopen、fseek、fread,在wiki中也可以查到用fseek去找bmp相關資訊的記憶體位置,還有要算水平和垂直解析度時,這個 bSize[0] +bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] *256*256*256還要記得除上39.37,因為原本是公尺,要將其換算成英吋才是正確的。最後一個遇到的問題是有些圖片的水平和垂直解析度會顯示為0,發現有些同學好像也會有同樣的情況,不過後來看到老師的回應才知道如果用PSPad檢查如果沒有存有這項資料就會讀不出來呀。
2009年10月22日 星期四
2009年10月8日 星期四
HW1
訂閱:
文章 (Atom)


