顯示具有 97360136 蔡宗甫 標籤的文章。 顯示所有文章
顯示具有 97360136 蔡宗甫 標籤的文章。 顯示所有文章

2010年1月15日 星期五

HW7

終於可以寫最後一個作業了(淚目),為什麼開頭第一句就這樣說,因為這是我寫最久的一次程式,從下午3點開始寫到晚上10點才寫完,整個不眠不休寫到眼睛都快爆掉了,真的沒想到多2個程式就快把我搞死了...好啦!趕快來寫完這最後的心得吧!


首先,要做的是將撥放的音頻檔的波形顯現出來,這個部分在老師上課的時候有提到過,所以還是實做最麻煩了,在毫無頭緒的情況下還是丟關鍵字去餵Google,於是,我找到有關WAV檔在BCB上的討論,作業6中我開WAV檔的方式是使用MediaPlayer去寫,而要找聲音的波形也可以用MediaPlayer來寫。

雖然Google上的資料有解釋波形,但要怎寫還是另一回事。 下面的程式碼就把波形抓到手!

f14_4_2->Refresh();
f14_4_2->Canvas->TextOut(10,400,IntToStr(f14_4_2->Srb->Position) );

divx=StrToInt(f14_4_2->Edit1->Text);
divy=StrToInt(f14_4_2->Edit2->Text);

f14_4_2->Canvas->MoveTo(0+dx,-data[0]/divy+dy);
f14_4_2->Canvas->Pen->Color=clBlue;
for(int i=1;(iWidth*divx)&&(i<(FileLen-dd)/2-1);i++) f14_4_2->Canvas->LineTo(i/divx+dx,-data[i+f14_4_2->Srb->Position]/divy+dy);





讀取波形的時候,或許是因為我的音樂檔案太大了,所以掃描一整段花了不少時間,而下面的X軸和Y軸比例也是,只要我動到裡面的數值時,就要整個重新掃一次。


好!接著就是做出音量控制的功能了!在Google的搜尋下,很快的我就找到了抓到WAV的音量及控制音量大小的方法!

===================================================
waveOutGetVolume(0, &Volume);
waveOutSetVolume(0, Volume);
===================================================
上面的2行程式能控制WAV音量,控制它也就相當控制了音量大小。 但是短短的這2行只能取出音量設定,還需要其他程式才行。另外程式中我用Bar這個元件做為控制音量大小的按鈕,但是寫程式時一直遇到即使寫好之後聲音還是不能控制,之後才發現我一直沒有把抓到的東西寫到Bar裡...
SetVolume(0,TrackBar1->Position*10); 這就是把值給寫進去!




最後,經過7小時的奮鬥,程式終於完成!作業7收工!

(備註:Google搜尋請打:BCB 音量控制,前面幾篇就可以看到相關的討論文章!)

HW6

課程開始介紹到影音的部分了,這次的作業播放WAV檔並且把他的檔頭資訊讀出來,在動手下去做程式之前直覺就想到,是不是要可以跟之前讀取GIF檔頭資料用相同方式寫出來呢?於是馬上上維基搜尋WAV的資料,很快的就在裡面找到各個資料所需指向的位置。那麼,只要資料到手一切就好辦了!

位置:

22---channels 聲道數
24---sample rate 取樣率
28---bytes/second 資料量/秒
34---bits/sample 取樣深度
40---bytes 檔案大小

找著找著都找到日本網站去了...好加在這學期有修日文...這張圖就是WAV的結構圖啦~!

話說得很簡單,但實做起來還是會遇到問題,知道了資料位置,那麼寫法上要怎麼弄呢?首先,我第一個參考的是之前自己做的讀取BMP檔的程式碼來寫,測試完之後看到預想中的畫面:爆了!早知道你會爆了!所以第二站我到了Google上找資料,一邊修改自己的程式碼,於是WAV的檔頭資料顯示成功!




顯示好檔頭資料後接著實做播放WAV音樂檔,因為之前在老師的部落格有看到WAV的相關介紹,所以我就去爬部落格



看完之後便開始做播放WAV部分,配合之前在Google所查的資料,把WAV檔撥放出來,這部分我覺得還比前面的好弄,所以程式寫得算蠻快的,後面在多加上顯示檔名,我這邊開啟的檔案是用自己載的音樂,所以出來的數值就跟老師的不一樣啦,測試播放也成功,OK,作業6完成!(顯示波形的部分我寫在作業7那)






HW8

很快的,一學期又過去了。數位媒體概論這堂課說真的,我覺得挺有趣的,老師上課的時候跟其他老師不同,不會只顧著講自己的東西,還會問問我們的想法讓我們參予討論,這點我真的覺得很棒!因為在討論的過程中有去思考,如此一來學習效果也就更加了。

回來看看這學期所寫的BCB程式,前幾周的課程我學習得很快,因為都是些簡單的步驟,而且只要在BCB的字典中就能找到相關的資訊(太厚了,所以真的算是字典),當找不到要用的元件時就查書,讓我寫起程式來不會到處撞壁。而從第四周作業開始就有挑戰性了,除了結合前面所學的東西,fopen,oseek,fread這三個指令在書上完全找不到,於是,讓我把搜尋資料的時間大多花在網路上,看老師給的範例程式,先理解整個程式架構是要做什麼,再把他寫成我自己的東西,每次一個作業都可以花我好多時間在上面,說真的,想不通寫不出來的時候會感覺到很煩,明明東西都沒有弄錯,怎麼出來的結果就是不一樣?但找到錯誤寫出程式的時候真的就只有一個字可以形容:爽!

每一次寫程式和討論都是在學習,學習如何除錯,如何寫得更完美,還有怎樣才能學以致用。這學期真的收穫很多,看著自己從零到有的BCB程式就很有成就感,我真的想說:這堂課真棒!

2010年1月3日 星期日

HW5

這次的做是讀取GIF檔案並且讀出調色盤資料,之後在將調色盤顯示在螢幕上。
老師在上課都時候有先講解GIF的檔案格式,並且附上範例程式,但是看到範例程式的時候讓我露出一抹微笑,呵,果然想錯了。

當初試作開啟GIF檔的時候,是參考之前所做的BMP的程式碼來寫,但是,寫完之後卻一直打不開?!格式的不同造成讀取的方式也要改,這點以後要多注意才行。

再來,就是修改老師給的範例程式了!每次這裡都是個大工程,因為每個人寫程式的時候的習慣不同,所寫出來的方式也就不一樣,像範例程式裡的許多變數名稱跟我一開始寫好的不同,所以這時候就要開始修改。

經過一番修改後,GIF檔的開啟順利完成了~!(話說...我這次又把自己程式介面給改掉了...突然發現程式實做出來後,要看檔案資訊還要按到頁面上的Information很麻煩,所以我把他跟圖片放在一起了)



開啟GIF中~



於是,GIF檔開啟成功!!圖片用的是老師給的金龜子圖,這時候改範例程式改很久的我真的超感動的,因為有些部分不明白是什麼意思,所以就一直上網查資料。當我感動之餘望向旁邊的GIF調色盤的時候...

這...這是3...不...這啥?那盤黑黑的墨汁盤是啥?

於是,這個時候只好默默的回去檢查程式碼,既然小金龜讀取沒有問題,那麼事情就簡單多了,我只要檢查調色盤部分的程式就好!

檢查的過程中,秀出畫面的256色存取格並沒有出錯,於是,我繼續往下找錯誤,發現那關鍵的變數k!

在程式碼中的變數k除了抓位用以外,他也是用來抓色彩值的數,把k讀進去後還要乘上之前轉灰階的數值,一開始時我把k的用處弄錯了...於是就手癢把他全改掉,搞出一盤黑墨汁,還要重新修改程式...




在幾經修改之後,終於讓我搞出右邊的256色調色盤啦!(灑花
接著就弄這次最主要的作業,將256色的調色盤排序~這個只要用Sort來排就OK了!至於比大小的值,就用灰階值來比啦! 而由暗到亮~亮到暗的差別就在於寫Sort時的大小於,所以就可以直接調嚕!

所以!排列順序成功!作業完成!

2009年11月28日 星期六

HW4

這次是第四次作業了,這次所做的主題是不用LoadFromFile的方式,而是用fopen,fread,fseek去讀取圖檔的資料後把圖給掃出來,而要做到這點,又需要用到PSPad這個軟體去檢查他的原始碼,跟之前一樣,WIKI上有指的位置的相關資訊,想看的請按這裏

在做這次的作業之前,有礙於之前的版面實在是太小了,讓我的圖顯示出來的時候都要用滾輪一直拉,這點真的是很麻煩,在看了老師上了的程式之後,我也用PageControl元件來將畫面進行分面,這個元件在課本中7-27頁有詳細介紹,所以在這我就不多說了,不過我的排版還需要再調整...個人覺得分頁之後看圖是不錯啦...結果Information那塊變得很空...看了很不習慣= =








這是我程式的新界面,看起來空空的,實際上都用PageControl分掉了。

在上課的時候老師有說明讀檔的位置,當下在教室作的時候遇到很有趣的問題,一般來說大家都會認為讀一張圖的時候是從左上角的RGB開始,但在實做出來的時候卻是從下方。


在PageControl分頁Cfile中進行讀圖(點圖可放大)。在這邊的畫面我是用動態宣告一個畫布,讓他可以自行去讀取圖的Width與Height,而動態新增一個影像元件的方法在老師的C++ Builder部落格中有介紹。這邊要說一下,很多人都有跟我遇到相似的問題,就是在動態宣告影像在ScrollBox之後影像會被裁掉,麻煩大家注意一下是否有在ScrollBox裡面多新增了一個影像元件,這會造成輸出的動態影像必須依照Image的大小來決定他的範圍,這樣反而會限制住圖的大小,所以切記啊...ScrollBox裡不要再多新增Image了...



掃完啦!!其實用這種方式的速度跟LoadFromFile開的速度差不多,不過在程式碼中就比較麻煩,因為RGB要3個為一組,所以我是設一個變數後在迴圈中+3來控制他。不過,如果不設變數的話,照道理來說程式應該會自己往下抓點才對,但是,如果將變數刪掉的話他卻掃不出來,這點倒是讓我很疑惑,不知是我的問題還是程式本身出錯。

2009年11月1日 星期日

HW3



最近這2周主要是學有關fopen,fseek,fread的檔案存取指令,在老師解說後對這3種指令有了初步的了解,但是在實做之後感覺還是收穫比較大,因為在寫程式的過程中一定必須先了解指令是做什麼的,這樣寫程式才會越來越有感覺。
而這次的作業是將BMP檔的檔頭資料讀取並以直接顯示出來,並非像老師在課堂中示範的Showmessage方式,要直接顯示在畫面上。老師的部落格有範例,所以我就不把程式碼在寫上來了,上圖是成功執行後的結果。
在寫水平解析度及垂直解析度的時候忘記要把 bSize[0] +bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] *256*256*256除上39.37(把公尺換回英吋),所以顯示都會有問題,現在已經解決啦! 再記一下水平和垂直解析度要找38 與 42byte的位置。

此外,上上星期作業裡有遇到一些問題,就是視窗右方的灰階圖的ScrollBox捲軸不會出現,而且出現的圖不完整,在查資料及詢問老師之後這個問題已經解決了,現在可以完整的顯示圖。趁著解決這個問題之後,我把之前做的程式在修改一下,讓整體排版整齊一些,之後程式還會慢慢修改並加入其他元件。
這週上課時面臨了在家做好了程式碼在學校無法開啟的窘境,原因是程式版本的不同,摸索了很久都沒法順利開啟,好在之後老師有救援,以後不會再犯這種錯了,畢竟摸索完學起來了。最後,上課中提到說做一個把影像資料全讀出來的程式,最近花時間再加進我的程式裡吧! 另外,我開始在程式碼後面加入註解以增加程式的可讀性,一定對理解程式更有幫助!!

2009年10月20日 星期二

HW2

這週作業是將24bits的bmp檔轉成8bits灰階圖,在課堂中老師曾要我們試著先自己寫程式碼,並且把方式告訴我們,要將圖層中的RGB相加/3,如此一來便能修改為灰階圖。

另外一個就是判斷我們開啟的圖是哪一種類型,判斷方式要用到switch來寫,可是,switch中的判斷點就不知道要怎麼寫了,看了老師的答案之後才知道要寫switch(Image1->Picture->Bitmap->PixelFormat)。

前面2部分沒遇到什麼大問題,但是,在課堂中提到的Scrollbox問題就比較多了,在實作之後發現,Scrollbox與Image1的size不容易調整,而且很容易造成顯示之後的位置出錯,這點實在很麻煩。另外一方面,在顯示灰階圖的畫面裡Scrollbox2的拉軸並不會出現,造成了灰階圖顯示會不完整,有一部分會被切掉,而且,如果左方開啟的圖比設定的Image2還要小的時候,在圖以外的地方還會變成白色的...這點還要想辦法處理才行。

-------------------------------------------------

更新:
之前上課的時候用的RGB相加/3的方法,並不能把24-bits的圖跟著轉8-bits,雖然圖看起來是變成灰階了,但是內部的結構卻仍然有問題。要完全轉成灰階圖,就必須先製作灰階的調色盤才行,另外也需要把輸進去的彩色影像值進行轉化;分別要乘上0.299,0.587, 0.144這幾個數值,課堂上老師說這是別人實驗出來感覺"灰階"的數值...但這是怎麼實驗我就不知了。

2009年10月7日 星期三

HW1

這是數媒的第一項作業!!主要是製做課堂中所學的程式,所以就先使用幾個簡單的範例


一開始成功的作出了圖層的XY座標以及3色值,但是有遇到一個問題,當開啟的bmp圖過大的時候,圖會蓋到我所設計的3色值,如此一來便會造成顯示不良。
(點圖可放大)

圖中圈起來的地方就是遇到的問題,也可能是因為排版的關係,不然就需要在設定值那邊調整了,但是以書中寫的Position來調整顯示位置還是不行,這部分還要研究一下。

接下來,製作的是利用左鍵來進行畫線,在MouseDown裡面設計
if(Button==mbLeft)Image1->Canvas->LineTo(X,Y);
這樣就可以制定左鍵的功能了~!!
顏色元件的設定必須使用在Dialogs裡的ColorDialog,並且在選單中設定color
void __fastcall TForm1::Color1Click(TObject *Sender){
ColorDialog1->Execute();Image2->Canvas->Pen->Color=ColorDialog1->Color; }


在圖中就能設定顏色來改變畫線色!


接著,在開啟新的圖片下也確定能夠使用。

再來就是製作Save功能了,但在這裡碰到了難題,原本打算儲存bmp檔,於是沒注意便點選了Dialogs裡的SaveDialogs,結果作出來當然是錯誤的。
如果要儲存圖片的話就跟OpenPictureDialogs一樣有對應的選項"SavePictureDialogs"。
void __fastcall TForm1::save1Click(TObject *Sender){SavePictureDialog1->Execute();Image1->Picture->SaveToFile(SavePictureDialog1->FileName);}

做好SavePictureDialogs功能之後我又遇到問題了,那就是在存檔的時候如果只輸入檔名的話存出來的檔案會無法讀取,必須將副檔名跟著一起輸入才能儲存檔案,關於副檔名這裡可能還有其他東西要設定,但在書中沒有講到這點,可能再問問老師吧。

途中圈起來的紅框(請點圖放大來看)就是在有輸入副檔名跟沒輸入副檔名的結果,有輸入的可以成功開啟,沒輸入的反而會說執行錯誤。

在做完一連串的操作之後,發現那本字典(課本)的內容真的很方便,介紹也算挺詳細的,只是有些地方跟自己實際操作不太相同,也是因為才剛接觸這新軟體不久,很多指令的功用都不清楚,看來還需要再多多摸索。