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了)
以上這小段純粹是自己看到別人的情況外加努力去做事卻跟著被老師錶三節課的感想以及抱怨
為何乖乖做事的人總是會跟著被罵勒? 此題真的是無解阿~

沒有留言:

張貼留言