顯示具有 97360633 李彥頡 標籤的文章。 顯示所有文章
顯示具有 97360633 李彥頡 標籤的文章。 顯示所有文章

2010年1月16日 星期六

HW8

 

這個學期其實很高興能修到"數位媒體概論"這門課
當初在選課時其實不了解這堂課在教什麼?
後來去問學長聽說是在教"BCB",之前曾經耳聞過BCB的
想說多學一種新的東西也不錯,就抱著有點好奇的心態選了這們課。

剛開始老師所教的BCB指令我完全一個都不懂
因為以前都是停留在Console階段的程式設計
沒有接觸過式窗程式(GUI)設計的方式
後來有了"磚頭書"之後才一點一滴慢慢累積對於BCB的了解
BCB是個很不錯的Lib
它幫你把系統核心與視窗的部分處理好
讓我們能用很簡單的方式做出我們想要的東西

只是這門個叫做"數位媒體概論"
既然講概論就要提到數位媒體的本質是什麼?
換句話說就是了解數位媒體到底是用什麼形是在運作?
所以我們開始用起了C語言的檔案開啟指令(fopen等等)
網路上的資料很多又加上以前高中曾有段時間用過C
所以稍微複習一下就會用了

隨著一次次的上課
一份份的作業(BMP GIF WAVE)
慢慢了解到這些常出現在我們周遭的東西是什麼
下次如果有人問起可以大聲的說"我會"

其實這學期花在很多的時間在Coding上面
像是光一個BMP就花了很長的時間在教
以至於壓縮到後面其它課程的時間
對這門課的建議
我是覺得可以多去探討一些媒體的部分或是"機器與人的關係"
好比說之前曾看到的這個影片

其實影片中的技術一般人也做得到
但是別人就是有創意
可以把不同領域的東西兜起來
轉貼一篇在黃世育老師在多媒體課程部落格的文章


外國人做得到
其實台灣的實力也不差
只是我們缺少刺激
去引發一些新的想法
只會等著別人答案,上上facebook,噗噗plurk等等
這樣話那幹嘛要學期花大筆的學費來這呢?

當然基本的東西也學習
只是我覺得比重可以稍微少一點
如果說有興趣去學的話
圖書館有書查
網路有專家問
有姿妘可利用
這才是所謂真正的"學習"吧?

以上只是一些個人的想法
最後祝各位寒假快樂~

HW7

1 
Program Name:SourceRIFF
Version:  0.02 alpha

功能:基於0.01載入header,這次增加了顯示其聲音波形的功能

期時花很多時間去想這個作業如何顯示波形
在網路上也翻了很久資料
其實提供的資訊並不多
因為很少人在做這個"基礎"的程式
大部分都是套用API(OpenCV,DirectSourd等等)下去使用

這次做得是透過Canvas底下的MoveTo與LineTo的函數去實做
上個作業有題到取出data的部分並不難
但是後來仔細看文件時並不簡單
像是我目前還是沒有辦法分出所謂的左聲道與右聲道(立體聲的音源)
所以這個作業只有做出混合的版本而已

至於其他的部分(像是fade in fade out)
因為要期末考了所以就沒有深入去研究
也許還寒假時再來仔細研究吧~

話說這次兩個作業又遇到了檔案讀取的問題
遇到了特殊字(像是- 空白字元)的檔名
不知道為什麼為自動跳掉不讀取
新版的BCB對於Unicode的部分真的很敏感
舊版的完全沒有這個問題
不過就長遠看寫unicode的程式不管在哪個語系的機器都不會有執行上的問題
某種角度來看也是件好是吧?

HW6

1
Program Name:SourceRIFF
Version: 0.01 alpha

功能:載入一wave檔並將其播出

說真的這個作業其實不難,稍微翻一下BCB的書還有爬一下文,就能知道撥放器怎樣實做了

重點在於WAVE的檔案格式為何?

WAVE的儲存方式其實和BMP類似,一樣是請教wiki
只是發現wiki的資料其實並不完整,沒有提到整個結構個別是做什麼用的
所以在這裡提供一個我所找到的資料
這是我在一個名叫Wotsit網站上查詢到的資料
website 
專門提供各種檔案格式文件給程式設計師的網站
之前學過的BMP或是GIF上面都有
像是商業軟體的Photoshop的PSD格是上面都有收錄
這簡直是個天堂阿~

回到正題
這次教我們利用int的性質來做資料的計算
之前做BMP時碰到要算檔案大小等問題時
每次都要一個個慢慢乘
真的很麻煩
透過運用int就可以簡省很多行程式碼了
真的很方便

老實說 我接下來真的不知道要打什麼了
這次作業比較可惜的是不知道要怎樣把wave的波型輸出
資料的取的是容易
只是我要怎樣才能輸出呢?

說到這個聲音
推薦大家一個免費的聲音編輯器

Audacity
軟體名稱:Audacity
官方網站:http://audacity.sourceforge.net/
軟體性質:Freeware

這個軟體是跨平台的(MAC Linux上都可運作)
功能媲美GoldWave或是Audition
如果說嫌破解商業軟體麻煩
免費軟體也是個不錯的選擇!!

HW5

其實這個作業很早就在做了,只是一直都有一些bug在,所以才拖到這個時候

1

Program Name:SourceGIF V2
Version:   0.01 alpha
               0.02 alpha
               0.01 beta

功能:
0.01 alpha 讀取GIF的基本Header
0.02 aplha 嘗試讀取調色盤
0.01 beta  結合0.01與0.02的重製版,並加入排序功能

2
按下Sort就能進行排序

這個作業期時花了我不少時間
好不容易上個BMP搞懂了,這次換一個新的,又加上關於GIF的中文資料很少,只能翻閱英文資料。雖然說我的英文普普,但要再重新去了解與翻閱新的資料與名詞花了我不少時間。

之前第一次上GIF時,老師帶我們一起看wiki的資料,有了實做BMP讀檔的經驗,看完資料後馬上開始動手做

做到一半時突然有個問題
Header資料中的GCT是什麼東西?
那堂課就問老師這個問題
其實這東西是表示三個項目(M CR Pixel)
M表示接下來的GIF調色盤是否為獨立還是分開的(動畫時會出現)
CR表示調色盤的色彩解析度為多少?
Pixel則表示色彩的寬度為何?

那要如何取出? 只有一個Byte在儲存啊?
在老師的範例中
有一段程式碼有出現>>或是<<
這個代表向左或是又"平移"多少
以GCT這個來說,如果是全彩的話
這個位置通常會儲存F7
換算成二進位就變成 "11110111"

首先是M的部分
>>7代表的是向右移7格位置就變成00000001也就是1

CR的部分
<<1代表向左移動1個位置
>>5再向右移動5個位置
變成是00000111

最後是Pixel的部分
<<5向左移動5個位置
>>5向右移動5個位置
一樣變成是00000111

換句話說
這一個Byte裡面他表示了三個資訊
GCT
所以我們要用>>或是<<的方式取出它的值
有人可能會問說為什麼要這麼麻煩呢?
別忘了GIF是個用來壓縮全彩影像的的格式
如果說把這三個值分別儲存
變成會占用3個Byte
這樣就失去壓縮的意義了
既然1個Byte就可以會什麼不存得更小一點呢?

2009年12月10日 星期四

HW4

這次作業與上次的大同小異,不過這次是要讀取BMP檔裡面的RAW值,並將它顯示出來。搭配之前所學的freed,fseek讀取RGB不是問題。

1

Program Name:SourceBMP
Version:         0.02 alpha
                    0.03 alpha(98.12.3更新)
編譯完成的程式檔可以從這裡下載

功能:
不透過LoadFromFile,直接讀取BMP圖檔的RAW值
修正:
(98.12.3) 修正fseek遇到控制字元問題,並將圖正確顯示

這個作業總共出現了兩種版本的程式寫法
第一種為「點讀取法」透過兩層for迴圈讀取每個點的RGB值

一開始實作時,一直出現個很奇怪的情況,顏色無法正確的顯示,後來查WIKI的資料才發現原來RAW的儲存方式不是RGB而是倒著回來的BGR,更改一下RGB輸出的方式就顯示正確了

用RGB的順序讀取
2
用BGR的順序讀取
3

翻文件同時也發現了RAW檔儲存的順序是圖片的左下角到右上角

在製作讀取程式時跟老師討論到調色盤(Palette)的事情
3png

之前一直不知道調色盤的作用,與老師討論過後才了解到調色盤是用來儲存整個BMP的顏色資訊索引值,可以應用在BMP檔的壓縮上面
BMP檔壓縮方法是假設有個圖有紅紅藍藍綠綠
傳統RGB方是個別存在54byte以後的空間,但這樣檔案會很大
透過索引值方式將紅藍綠存在54byte以後當成參考值
在原本存顏色資訊的地方指定索引值的位置再透過RLE壓縮法就能做到無損壓縮BMP

至於RLE是什麼?查WIKI的資料它叫「變動長度編碼法」直接解是太抽象我用例子解釋一下
假設有筆資料為AAAAABBBBCCCC總共需要13個位元儲存
RLE的方式為將資料改成另一種表示法
AAAAABBBBCCCC → 5A4B4C 只需要 6個位元就可以儲存了
再透過演算反解壓縮資料就能還原為原始資料

至於詳細的實作方式還在研究中

第二種為上次上課老師提到用ScanLine一次讀取一列的方式,比第一種方式快很多
原本的點搜尋法讀取大圖檔時非常的慢

98.12.03補充:
透過將fopen讀取指修正避免fseek遇到無法讀取的RGB值(控制字元)
這是原本的寫法fopen(“text.bmp”,“r”);
新的寫法為fopen(“text.bmp”,“rb”);
加了這個b讓fopen以binary的方式讀取檔案
用原本的r模式是以文字的方式讀取檔案
但是檔案中可能會遇到一些控制字元(例如空白等)
會造成讀取錯誤
所以之前第一次實做時才發生了fseek不會往下跳的情況
透過b模式強制fopen用二進位的方式讀取(直接讀資料不轉換字元)就可以順利讀檔正確了

2009年11月6日 星期五

HW3

1

這次作業花了我很多時間在處理跟程式寫作無關的東西
因為這次要使用最原始的C語言去開一個BMP圖檔
為了避免與之前做的檔案混淆或是部分功能衝突
重新思考必做一個新的UI

Program Name:SourceBMP
Version:         0.01 alpha
功能:
讀取BMP的檔頭資料,並將其顯示出來

有興趣的人可以從這裡下載執行檔

這幾個禮拜老師要我們透過fopen fseek 與fread去開啟一個BMP檔案
讓我回去翻找高中時學習C的記憶
加上網路上查詢相關指令說明
馬上就能將圖檔載入並將部分檔頭輸出

指令說明:

fopen
這個是一在C語言中用來開啟檔案的指令,使用前必些要先載入stdio.h並用FILE * 變數去使用
使用方式
fopen("檔名","開檔的方式");//開檔方式分別有r w a r+ w+ a+
ex: fopen("abc.txt","r")
因為太久沒有用過所以一開始開檔方式直接用w
結果造成BMP的原始資料被破壞
與老師研究弄老半天才發現這個問題
所以以後透過fopen開檔時一定要注意自己的使用需求

fseek
這個可以直接指定要從檔案哪個地方讀取
使用方式
fseek(檔案的變數名稱,位置,位置從哪個地方算起);
ex: fseek(file,1,SEEK_SET);
第三個參數有三種方式可選擇
SEEK_SET從開頭
SEEK_END從結尾
SEEK_CUR目前的指標位置(這個沒有試過)

fread
這個是用來抓取檔案資料的通常搭配fseek使用
使用方式
fread(抓取資料後放置的空間,抓幾個byte,總共抓幾個byte,抓取資料的位置)
ex: fread(buf,1,2,file);

以上都是我參考一些文件後的心得,不曉得有沒有錯

講完了指令
現在要講得是我在寫程式時遇到到的問題
因為我是使用C++Builder2010(BCB的新版本)
一開始在fopen裡面直接寫絕對路徑時都沒問題
但將路徑改為動態抓取時
原本的fopen(OpenPictureDialog1->FileName.c_str(),"r");
Compile不會過
2 
一直卡在這個問題
後來透過BCB給的錯誤訊息上網爬文
才知道自從BCB2009版以後加入了Unicode的問題
官方為了解決這個問題後來又另外洗了一個叫t_str()的函數
所以2009版以後要改成fopen(OpenPictureDialog1->FileName.t_str(),"r");
這樣才能完整的通過
至於為啥官方要這樣做網路上的資料並不多
或許改天自己研究一下這個函數的原型

解決了檔案名稱的問題
接下來就是重頭戲讀取BMP檔頭資料
3png
BMP的組成如上圖所示
第一區塊儲存的像是檔案類型 檔案大小等

第二區塊儲存的像是檔案長寬 位元格式等
詳細資料都能在wiki上找到

第三區塊儲存的是色彩的索引值為4的倍數儲存
不夠的話會以0補齊

第四區塊就是記錄圖檔每個像素點的顏色資訊

其實這次程式不難
把BMP格是文件與指令文件看得懂
並套用老師給的結構
程式就只要注意不要抓錯位置就好了
難在是根本不肯去做

很多問題的解決方式網路上或是鍵盤上按F1都可以找到相關訊息
資訊日新月異
學資工的就是要多多涉獵各東西
就算沒聽過也要有最基本的查資料能力
如果說這都沒有
每天只會耳邊聽耳機,左手遊戲機or手機,右手滑鼠Facebook
然後只會抱怨機器很爛等等
這些都不是理由
重點是有沒有心而已
有心要把程式寫好的話就算沒有電腦
隨便拿張紙片都能寫下腦袋中的想法

我自己也有類似的體驗(睡覺時腦袋還在想 醒來就OK了)
以上這小段純粹是自己看到別人的情況外加努力去做事卻跟著被老師錶三節課的感想以及抱怨
為何乖乖做事的人總是會跟著被罵勒? 此題真的是無解阿~

2009年10月20日 星期二

HW2

1

程式版本0.02 alpha
更新: 1.增加24位元轉8位元灰階影像功能
2.增加一鍵隱藏畫布
3.增加進度列以了解轉換圖檔進度
4.檢查載入圖檔的bitmap值

這禮拜又學到了一個新的東西關於bitmap的影像格式
根據wiki的資料
BMP這個格式是由微軟開發,用於視窗程式上的一種簡單的圖像存檔格式
因為BMP並不做壓縮的動作所以檔案會很大
存檔格式分別為下列(以一張圖作範例)

範例圖:

龜山島,台灣宜蘭 (Turtle Island in Ilan, Taiwan)
這張是宜蘭外海龜山島的龜首(講"頭"好像有點怪怪的...)

1位元
只有兩種顏色黑與白
因為儲存資訊就只有0或是1,所以非黑即白
bitmap1
4位元
2^4=16以這個格式儲存只有16種顏色可選擇
bitmap4
8位元
2^8=256
有256種顏色可選擇的灰階圖
bitmap8
16位元
2^16=65536
從16位元開始影像可以存為彩色影像,但仍然可看到色快出現,因為可選擇的顏色仍然太少
bitmap16
24位元
2^24=16777216
一般全彩的影像通常都是用這個格是在儲存的
bitmap24
32位元
2^32=4294967296
基於24位元原本的顏色亮外再加8位元用來表示顏色的Alpha值
bitmap32

作業部分:
這次作業要做的是將一個24bit的全彩圖轉成8bit的灰階圖
老師直接告訴我們公式如何做轉換

灰階值=(R+G+B)/3

所以腦袋馬上有個想法
直接開兩個陣列去圖檔每個像素點套用以上的公式
得到的程式碼大概是長這樣(這只是概念碼,完整的還要加一些東西)
2

執行結果:
3
就這樣完成了第二周的作業
不過有遇到了個問題是
右邊那個畫布當載入比它大的檔案時沒有辦法AutoScroll
經過反覆的檢查設定是一樣的
但是它還是不會自動作改變
這是一個還蠻奇怪的現象
重拉一次元件也是同樣的情形
有誰能告訴我這是為啥嗎?

2009年10月8日 星期四

HW1

第一次摸BCB感覺蠻新鮮的
之前用Win7跑BCB6
雖然沒有啥大問題
但畢竟程式已經老舊
之前不知道為啥我存好原始碼後會莫名其妙被改寫
透過某些管道取的最新本
所以目前用的是C++Builder2010版本
它現在改名為RAD Studio 2010
公司網址看這

1 

程式版本:0.01Alpha

這個純粹只是做簡單的讀寫圖片、畫線上去

 2

讀檔 
3

畫筆+選顏色

 4

選好顏色+上色

比較圖

HenrySourc_BMP 

上色後

1 

整個寫下來沒有什麼大問題
比較有疑問的是
當在存圖片時
預設不會給副檔名必須要自己打
但很奇怪的是副檔名自己定.jpg .bmp .png .gif都可以打開
所以程式在儲存時到底是用啥格式在存的?
真的很令人好奇
BCB其實還蠻有趣的
雖然說還不太熟
但只要稍微翻一下字典大概就OK了
改天在來研究一下其他有趣的指令吧!

PS:有興趣的人可以下載來看看 按這裏