顯示具有 2009hw3 標籤的文章。 顯示所有文章
顯示具有 2009hw3 標籤的文章。 顯示所有文章

2010年1月16日 星期六

HW3

這次作業的主題是有關 fopen,,fseek,fread 這幾項指令
首先是我的程式結果

HW3-1

由於我的程式是照著同學的教學一步一步做出來的
所以其實對於指令的作用在幹嘛不是非常清楚…
為此我特別上網研究了一下這三個指令

---------------- 分隔線 ----------------

fopen:
開啟檔案或者 URL。
語法:
int fopen(string filename, string mode);
傳回值: 整數
函式種類: 檔案存取

這個指令主要是是用來開啟檔案用,也可以用來開啟網頁。它是將內部游標移動到欲開啟的檔案處做開啟的。由他的指令語法我們可以知道,藉由輸入正確的檔案名稱即可開檔。後面的mode是所謂的開啟模式,輸入不同的代號有不同的開啟方式。

  • 'r' 開檔方式為唯讀,檔案指標指到開始處。
  • 'r+' 開檔方式為可讀寫,檔案指標指到開始處。
  • 'w' 開檔方式為寫入,檔案指標指到開始處,並將原檔的長度設為 0。若檔案不存在,則建立新檔。
  • 'w+' 開檔方式為可讀寫,檔案指標指到開始處,並將原檔的長度設為 0。若檔案不存在,則建立新檔。
  • 'a' 開檔方式為寫入,檔案指標指到檔案最後。若檔案不存在,則建立新檔。
  • 'a+' 開檔方式為可讀寫,檔案指標指到檔案最後。若檔案不存在,則建立新檔。
  • 'b' 若作業系統的文字及二進位檔不同,則可以用此參數,UNIX 系統不需要使用本參數。

fseek:
移動檔案指標。
語法:
int fseek(int fp, int offset);
傳回值: 整數
函式種類: 檔案存取

這個指令是移動內部檔案的游標,藉由移動游標改變讀取位置。但如果由fopen開啟網址類的檔案,此指令不能用。

fread:
元組的方式讀取檔案。
語法:
string fread(int fp, int length);
傳回值: 字串
函式種類: 檔案存取

此指令輸入後可以讀指定長度的位元組或直接讀到檔案結尾。

---------------- 分隔線 ----------------

這三個指令其實就大概是這樣。不過,這類型的指令不只這三個。還有flock(鎖住檔案)、fpassthru(輸出所有剩餘資料)、fputs(寫到檔案指標)、fwrite(二進位位元方式寫入檔案)...等等。似乎這類型 f 開頭的指令都是在進行檔案的存取,不論讀取或輸出。

2009年12月23日 星期三

HW3





目前程式對於開啟與儲存影像功能只對BMP檔案有效,JMP影像可以讀取,但儲
存還不算成功,因為儲存的時候有點小問題,好像"未定義成功"的樣子。
程式對於讀取影像資料無誤,只是感覺好像少了甚麼。
在RGB色彩上也有所回應,目前可以把滑鼠游標的座標讀出來並可偵測圖像上的
RGB值並顯示,加上了游標上那點的顏色顯色。

程式的介面較為簡單,除了TOOLBAR的兩個製作外,還有了快捷建。
目前正著手分頁的製作,對於IMAGE指向其他分頁,並做影像處理的部分有點卡
關。因為還不太清楚程式的指向到底指去哪了,編譯會過,但在黑白、灰階、反
相的分頁上,只有黑白目前有顯示,灰階跟反相的IMAGE不知道跑去哪了,跑不
出來。

目前還修編中,希望這個程式能夠更完善,感覺加了這些東西進去,都筆小畫家
好用多了。

因為電腦從XP變成WIN7,還有很多東西不習慣....
且之前的檔案不小心刪掉了,沒備份。
因此,旋轉、複製區塊、貼上、裁減、畫筆、放大與縮小的功能都沒了啦~~~
其實還蠻想哭的...
只記得備份寫真集,卻沒備份作業。像智障一樣.....連其他作業我都忘了備份Orz

2009年12月22日 星期二

HW3












第三次的作業是要讀出BMP檔案的資料(長寬 解析度等資料)顯示在LABEL上

在這次的作業當中第一次接觸了FOPEN FSEAK這些東西

實在是不太熟悉於是去資料結構的MOODLE討論區中開了一個討論版看有沒有同學會

結果得到的答案都十分的抽象 於是就嘗試了自己查資料 不過依然是有點撲朔迷離

還好接下來的幾堂課當中老師都還是有加強這幾個東西的使用方式 只能說是平台不一樣

使用起來也因此不太順手 看了老師的範例檔之後總算可以做出這個結果 但是製作過程當中忘記將公尺轉換成英吋 造成資料顯示的地方會出現錯誤的數值 但在知道要做轉換之後 總算是讀出正常的資料

HW3


這星期老師要我們把BMP檔案寫出來,要注意的地方就是解析度要將公尺轉成英寸所以要在除上39.37才會變成dpi值(dot per inch)。fread、fopen和fseek 要使用這3個指令,一開始我還真是都抓不到頭緒,畢竟要承認沒有學好,問同學也是會很用心的教我,要求圖的內容是要
大小int IFileSize = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;

寬int ImageWidth = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;

高int iImageHeigh= bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;不過這次好像有幾個東西沒有弄出來的樣子??每次的作業都是累加上去的,弄一弄感覺這個程式更加完善了,功能也越來越多,也表示東西越交越多。真的有點難度了...

2009年12月21日 星期一

2009HW3



<-這是開第一張圖的時候。













<-開第二章圖的時候底下卻有第一張圖的痕跡。
怎麼辦??
雖然這次的作業跟前幾次大部分都相同,但是我還是會卡卡的改很久。有去看了老師po的程式碼,但是我還是有一些問題。所以當然是問同學囉~~但是還是有一點不懂的地方。

HW 3

上次有上傳一次 HW 3也有成功發佈,

不過在修改時不知什麼原因.......,

結果不見了@@?

嗯...很詭異的事件,所以我在重新PO一次。


以下為執行結果:
















這次的作業是用 fopen,fread與fseek來做開BMP的圖檔

、讀取,且將其圖片的資訊SHOW在畫面中,相較於

之前作業所用的開檔程式,這的確是較為複雜些,

而這次作業需要注意的地方是:

在讀取解析度時,須將值除以39.37,

因解析度值須把公尺轉為"英吋",

多這步驟才為才為dpi值(dot per inch),



這次作業的fopen,fread,fseek,



需要多多留意寫法及用途,

因為之後的幾次實作中應該會應用上,

簡言之,第3次作業.......結束!!! ^^

2009年12月20日 星期日

hw03


這次的作業就是要將記憶體儲存的資料取出來,而相對記憶體所儲存的資料又截然不同,記憶體位置可以從維基百科可以查,然後利用fseek將裏頭的資料取出來,這很像打開,只是開的東西不同

2009年12月3日 星期四

HW4

PSPAD雖然在上資料結構的時候有用過,但是實際上用起來還是很不熟悉,改用不同的方法去做,雖然感覺很新鮮....但是做起來卻是一點也不順利,有點麻煩,主要遇到的問題是,有些圖片顯示出來的水平還有垂直解析度是0....我一直去試不同的圖片,發現有些圖片就可以正常顯示解析度,可是有些始終是掛0。改用fopen去開檔,比原本教的複雜許多,程式的執行速度感覺也沒有快的很驚人,我還是喜歡用原本那個程式碼不複雜又能輕鬆達到我要的LoadFromFile。

HW3



這次的作業老師要我們把BMP的圖檔的資料讀出來,我們要使用fread、fopen和fseek 。使用fread將圖片檔案的資料讀取出來fopen則可以讓所選取的圖片打開fseek可以指定檔案的目標位置,讀出來的圖片資料有下面幾項
例:圖片的格式、高與寬、大小和解析度

檔案大小的開啟:int IFileSize = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;

圖片高和寬:
int iImageHeigh= bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;

int ImageWidth = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;

這次作業有個要注意的地方就是解析度要將公尺轉成英寸所以要在除上39.37才會變成dpi值(dot per inch)。fread、fopen和fseek 這3個指令好像是專門用來抓圖片檔案的資料,開啟、指定、讀出,在最近的作業和老師的上課內容中是最為重要的也是讀取圖片檔案資料要用的指令,這次的作業跟前幾次的有點不同,前幾次的作業比較像是要我們寫出類似小畫家功能的程式,這次的作業確比較像是一般電腦開啟資料夾旁邊會顯示出檔案內容大小的東西感覺跟"圖像"的關西比較少比較像是跟"檔案"有關,不過這次的指令我們也知道了一些跟圖片比較沒有關西卻跟檔案有關的知識。

2009年11月25日 星期三

HW3













這次作業是要把BMP的圖檔讀出,這是我設計的程式草稿。用上一次作業的程式改的,看著程式功能越來越多,就會有種得意的感覺,但這些都只是一些皮毛而已。 由於沒吸收到課堂上的資訊,程式打起來非常吃力,只能看著範例程式,慢慢研究了解。



















上網看了BMP圖檔的頭檔資料,從0開始的2個位元組是顯示點陣圖文件的標示符BM,再來是4個位元組來顯示各項資料,維基百科標示了15組,而我簡單顯示8組資料。bsize[0]+bsize[1]*256+bsize[2]*256*256+bsize[3]*256*256*256可以把以4個位元組顯示的資料顯現在程式裡。


















這是執行的結果,一開始執行的時候遇到一點困難,就是頭檔資料顯示一直不正確,dword 一直都只有第一個數字有值,其他都0。後來發現是我fread函數參數設錯,果然寫程式前要先了解函式的結構啊,這次還用到了fopen 和fseek C語言的函式,學的越來越多要記的也越來越多,這也是好事啊!

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

WH3



老師這禮拜要我們把BMP 影像的檔頭資料讀出來,一開始看了老師的示範檔,感覺一切都很順利,但是BCB的環境畢竟跟C++不太一樣,再說我C++也學的不扎實,所以一開始就讓我攪盡腦汁,最後經過查老師的檔案在找一下資料用了fopen(OpenPictureDialog1->FileName.c_str(), "r"),讓我成功的用了選單。
檔案大小int IFileSize = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;
圖片的寬int ImageWidth = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;
圖片的高int iImageHeigh= bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;
這些程式碼雖然我ㄧ開始都不太會寫,但聽了老師解說在去了解一下其實也不是想像的這麼困難的,可是fopen fseek fread這三個我還是不太懂.....查了一些資料好像是點陣圖頭的位元組的位子,可是就是想不通她好像是為了讀圖檔所創的...好難喔,他們的差別和公用我想也是這次作業的重點,還要再找找資料問問同學了!

HW3


這一次的作業遇到了些小問題,像是一開始宣告的 char cBuffer[8],假如宣告成
char cBuffer[20],在抓標頭檔時,就會抓到後面的一些資料,而顯示出亂碼,而且也不知道為什麼,假如我把桌面畫面剪下來,存成BMP檔,在用程式開起來,結果顯示出來的H_resolution和V_resolution,都會是零,假如用網路上的圖,都可以顯示得出來,這是為什麼?

HK3

昨天上課又再一次的被精神喊話
老師給我們看一位工程師寄信專程來問老師題目
也想到自己也已經大四了~~~
聽老師說程式設計的重要
讀資工的不會寫程式要會什麼?
又想了一下自己程式會了多少?
想一想自己不知不覺這樣四年就過去了~
換來的卻不知道學了什麼東西?
每個領域都是東會一點西會一點
而沒有一個是專精的
這一次的作業是要我們會讀取一張圖片的內容所有資訊
從檔案大小到長、寬、水平深度、垂直深度等...
所用的指令fseek,fread,fopen
fopen是要開啟檔案
fseek是要只一個檔案的指標
fread是把記憶體的struct填滿
當老師昨天在看每一位同學所弄得作業
都是把檔案的內容以另一個視窗顯示出來
而要我們做的是要用label顯示
當老師在看每一位同學的作業時
就在想要顯示在label上面
是不是把showmessage改成label就好了
果然當給我們寫的時候裡面的程式主不過稍做修改就成功了~試過果然信心大增
回家想上次的灰階跟這一次的成是結合在一起感覺怕怕的
果然一開始又出現了上一次無法顯是灰階圖片的問題
又逐一的檢查程式碼再去改總算成功了
並且聽到老師說要能看出其他想關的內容解析度
果然把原本的去除以39.37就得到了72這個數字
但不知道為什麼位元深度卻照自己想法去做卻得到0
怎麼改都不對~
而且不知為什麼label的中文字為什麼會被殺掉一點點
明明就有拉長為什麼還是這樣?
還要再研究啦~~~~

hw3

這次作業用到fopen來讀取圖片資料的相關資訊。因為是第一次接觸fopen,剛看到老師的範例程式碼,當然是看不懂,但聽了老師講解和上網找資料後,慢慢的了解要如何來讀取圖片資料。

HW3


這次的作業是在label上把檔案的格式 大小 以及長寬險是在上面,上次老師在課堂上所做的是開啟檔案之後,他會直接一個一個SHOW出檔案的相關東西,這次則是叫我們回家把他放在Label上顯示出來。


一開始老師在講fopen,fseek,fread這些東西時,其實我不不太了解,上課看了老師的範例把程式碼打了一次,回家又做了一次,多少有比較了解到這些東西的公用,在上次的課堂上老師也有說明fopen,fseek,fread是做什麼用的,據我上課所聽到的,foprn是把東西放到記憶體當中然後fseek是他走的路徑的方法,fread就是讀取內容,這是我的認知,不知道有沒有錯。

HW03

















這次作業是要將圖片的詳細內容給讀出來,
聽到老師說要讀記憶體位置,對於記憶體位置,真的有點給他搞不懂。

今天主要的課程是要使用fopen,fread,fseek。
老師說這是最基本的幾個指令
對於初學的我只能上網去查資料了
唯一有接觸過的只有fopen,用來開啟檔案,並且配合fclose來將指令關閉,避免浪費記憶體。
fread表面看起來就是"閱讀",沒錯!他就是閱讀fread(變數名稱,幾次,幾個,檔案名稱)
fseek則是尋找,我們這次得作業是拿來尋找要讀的記憶體位置的開頭,以指標的形式將他指向讀檔的開頭 fseek(檔案名稱,記憶體存放位置(開頭),SEEK_SET(指向這裡))
fseek先是將要讀記憶體的位置找到後,在使用fread將資料讀出來。
瞭解了大概做法之後就開始實做了
設變數部分我參考老師的設法,有使用byte、int、char
在課堂上其實我不是很了解這些設定的方式
是回到宿舍後才了解的,byte拿來接收讀到的byte
可能是沒用過吧 還真是不習慣。
接著就開始尋找讀檔位置了
聽老師說,可以在維基找到記憶體儲存位置
當然就上了維基
也找到了相關的記憶體存放位置
然後利用fseek將裏頭的資料取出來 ,接著就將它顯示在label中 。
其中:水平解析度和垂直解析度我卻讀不出來
當下也詢問老師,老師使用pspad將記憶體的存放圖show出來,發現維基上的存放位置竟然在pspad上出現是空的!! 這個地方我就不太懂了。
BYTE bSize[4]={0,0,0,0};
int iFileSize,iFileWidth,iFileHeight;
char cBuffer[3];
OpenPictureDialog1->Execute();
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName) ;
FILE *fp; //宣告檔案名稱
fp = fopen(OpenPictureDialog1->FileName.c_str(),"r") ; //檔案名稱,"r"//閱讀

fread(cBuffer, 1, 2, fp); //讀標頭檔
Label8->Caption=cBuffer;

fread(bSize, 1, 4, fp) ;
iFileSize = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;
//將讀到的byte作運算
Label10->Caption=iFileSize;

fseek(fp,18,SEEK_SET);
fread(bSize, 1, 4, fp) ;
Label11->Caption=iFileWidth;

fseek(fp,22,SEEK_SET);
fread(bSize, 1, 4, fp) ;
FileHeight = bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;

fclose(fp); //關閉fopen

(上面只有部分程式碼,怕太多占版面)

HW3


1.程式原型
2.最後成果
利用fopen,fseek,fread等程式和bSize[0] +bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] 再加上
bmp檔頭表就可以做出讀取bmp檔資料,一開始覺得很難但輟的過程中其實動作一直重複只是要注意每一個資料的byte數以免讀取錯誤,水平和垂直的解析度還需要再除39.37才能得到一公尺有多少bpi數 (dot per inch)








HW3



完成了這次的作業,這次的作業用到老師教的fopen開啟檔案,fseek指定
目標位置, fread將資料讀近來。所讀出的資料有圖片的格式、寬度、高
度、大小、解析度這些值, 其中解析度的值因要將公尺轉換成英吋,所以
要再將值除以39.37才為dpi值(dot per inch),老師上課所教的範例程式
是一個一個show出message,但這樣太繁瑣,所以用 Label->Caption
或列Memo讓他們看起來一目了然,這是老師今天上課一再提起的注意 事
項,做完了這次的做業也對fopen、fseek、fread有了更多的認知了,繼
續加油!

2009年11月5日 星期四

HW3


經過老師一堂課多的"自我檢討",我更能感受到老師認為我們的未來前途茫茫,不只是努力的教作業和應付考試而已,重點是要會"寫程式",說真的挺多老師說過主任也是,"只要會寫程式就很有用了",但是這"寫程式"的定義,是真的要會寫程式,不是寫寫簡單又小的程式,也不是頻頻和老師同學討論,更不是copypaste,以後在職場上通常都是要靠自己,要多利用身邊工具,網路、書籍等等,所以從現在開始我們就要習慣利用身邊各種資源,以後找資料就會更輕易上手,當然趁現在可以討論還是必要的。
這次交了fopen,fread,fseek,如果真的只看程式碼還真看不懂,而且fseek還需要位元組的位置才能找到檔案的資料,還有同學po了fopen,fread,fseek三個指令的說明,非常細心,也要感謝他讓我更了解一些,老師也幫我們解決了像素點的問題,單位要以公尺換公寸,所以100/2.54約等於39.37,所以就再除以39.37就正確了,現在還有個問題,cbuffer會出現亂碼,還有有些BMP檔的解析度會為0,感覺還是有很多問題待解決啊!