顯示具有 97360986 鄭朝庭 標籤的文章。 顯示所有文章
顯示具有 97360986 鄭朝庭 標籤的文章。 顯示所有文章

2010年1月16日 星期六

HW7

  第七次的作業是要撰寫一個可以處理音訊的程式,像是修改聲音大小的功能。 之前聽老師說把裡面的值除以2再放回去,就能將音量變小。初步認為WAV檔在檔頭記憶體45之後是存放所有有關音檔播放的內容,所以應該是會有存放有關音量大小的控制,但卡在程式不知如何開始寫,不知道該如何下手。剛開始的時候還以為好像不會很難,但實際操作後發現還真的不是那麼一回事啊。或許沒有老師的範例程式,就沒有方向了,慚愧呀。
  這一次的作業真的不容易,也在google上爬了好久的文,也找到了這個
控制音量 ,但是試著照上面的說明來打,還是沒有成功,目前我的程式是卡在未定義的"waveOutGetVolume" 和 "waveOutsetVolume" 。 應該是先要設立一個標頭檔,可是不知道該用哪個。
  如果能將這個程式完成的話,就好像我自己完成了一個小型的播放程式,之後我會再利用時間來研究看看 如何來修改聲音的大小,現在只能先打上我作這個作業所碰到的遭遇和心得囉。

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);

這是之前的結果:大功告成~~之後就是我的完成品:


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

開其它圖片來玩玩~~


2010年1月15日 星期五

HW6

  這次的作業是將 WAV 檔頭資料顯示出來,所以就先上網去找尋有關檔頭的資料,不過沒有在wiki上找到,不過在另外的網站找到了。

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);  
//讀B,G,R
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的指令,從剛開始完全不會到現在可利用指令來查詢所要的東西,感覺很棒。
  我覺得老師的教學很不錯,會和學生互動並且和我們來討論一些東西和老師教學的方向,該如何可以讓學生學的更好。雖然我不敢說老師教的我完全都吸收了,不過也像老師所說的,學程式必須要自己弄懂其含意,要身體力行 ! 我會將此話放在心裡頭,來警惕自己的。


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日 星期四

HW2

這次是講有關於BMP圖片檔的位元影像,用switch判斷放入影像的位元數。作業是將讀入一個24位元的彩色影像,然後轉成8位元的灰階影像,剛開始老師要我們先自己動手做做看,但大家都想很久,直到老師講了一句關鍵句,那就是將RGB除以3,就能將24位元轉成8位元的影像,覺得真的很好玩,也期待下次的課程內容。

2009年10月8日 星期四

HW1



感覺在學這門課的BCB,很像是在現學現賣,因為蠻多指令都還不熟悉,所以老師一講完作法,我們就要開始動手操作指令,不過學過之後,就會覺得BCB是個非常神奇的軟體,裡面許多的物件都已經內建好了,省去許多使用者的時間,想用到什麼就把對應的物件叫出來,這也是我們最先學到的視窗程式軟體。在老師上課中,BCB也包含了有關多媒體的物件,像這次的作業中,就展現了我這次學到的東西,如何在一張圖上找到X和Y值,還有RGB,在圖上畫線和換顏色等...不過東西變多之後也顯得複雜許多,也難怪訂的那本BCB的書會那麼厚厚的一本了。