2010年1月16日 星期六
HW4
HW4
這次作業是也是讀取讀片。可是跟第三次不太一樣的是,我們這次是用一個一個畫素點讀取在重新輸出的方式顯示。意思就是我們會從圖片檔的最左上方的畫素點開始讀取,讀一個就輸出一個。
這次也會用到上一次的那三個指令
一樣先用fopen開啟檔案,再用fseek移動游標,最後使用fread讀取
因為是一個一個讀。所以需要用迴圈的方式寫。如下
for(i=0;i
{
fseek (imBMP,offset,SEEK_SET);
fread (bSize, 1, 3, imBMP);
offset+=3;
Image1->Canvas->Pixels[i][j]=(TColor)RGB(bSize[2],bSize[1],bSize[0]);
}</IIMAGEWIDTH;I++)>
HW4

這次作業跟作業三有異曲同工之妙,這是要我們用frpen fread fseek開啟BMP檔,目的是把圖一個個放進檔案元件內,而不是用LoadFromFile,相較之下難度有增加,看了看老師的飯粒程式,似乎有一點點的了解,以下三行是要再多加到程式碼裡面,
bPtOriginalImage[j*3+2]=ctColor[0].bRed
bPtOriginalImage[j*3+1]=ctColor[0].bGreen
bPtOriginalImage[j*3]=ctColor[0].bBlue
感覺起來這三行像是在寫三原色,才知道是用來把RGB資料寫入影像元件中,還需要用到PSPAD來找出原始檔,PSPAD雖然在資料結構中有用過,但是沒有很熟悉他,原來PSPAD的功能這麼強,隨著作業的次數增加感覺程式越來越難了,加上BCB算是第二種程式,也只能盡力把他學好了。
2010年1月15日 星期五
HW4
這是第四次作業,跟第一次一樣是開圖,但在第一次作業我們是使用BCB裡的開圖元件只要選擇檔案他自然就會去讀資料,這次我們做的是自己寫程式讀檔一個一個點畫上去。
首先點選視窗上的Drafting,待電腦跑完會出現如下面的圖
結果看起來是跟第一次沒什麼不同的,但過程卻差很多。
寫這次程式會用到fopen、fseek、fread,首先就是讀檔頭的資料把資訊show出來,但這邊不知道為什麼用OpenPictureDialog的話檔頭可以顯示BM很正常,但一樣的作法使用在這邊就會如上圖一樣,後面出現一串亂碼,弄了很久還是不知道怎麼解決。
讀完檔頭之後就是開始讀圖的內容,也就是x座標的三種顏色,一個接一個畫上去,這邊都是重複的動作便不再多做說明。
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);
offset+=3;
Image1->Canvas->Pixels[i][j]=(TColor)RGB(bSize[2],bSize[1],bSize[0]);
}
HW4
這次的作業大致上就是使用FSEEK將檔案的資訊讀出來,接著再用FREED讀取出來,前幾次作業讀出來的圖片都是直接顯示,誰知道這次的結果是慢慢得出來,感到比之前的結果有趣一些,希望未來可以學會更多的技巧,越來越熟練可以變出越來越多的花招
HW4
這次的作業是將上次以LoadFromFile的開圖檔方式,改成OpenPictureDialog->Excute(),開圖的方式就變成以點去掃圖,從左下角開始掃圖到右上角結束,而圖片的每個像素點是一個BGR組成,很神奇的是並不是RGB,所以這次掃圖的方式開圖檔會比之前的LoadFromFile的速度慢一些,而我也參考了老師的範例程式,註解非常詳細讓我一看就懂,這次多用了struct和unsigned宣告新的資料型態而unsigned還是第一次學,到靠近期末的資料結構課也用到了,使我更熟悉,老師這次也幫我們解決了圖檔高和寬不是4的倍數的問題,因為這次是每點去描圖,所以產生了LoadFromFile沒有的一個問題,如果圖檔高寬不是4的倍數整張圖讀出來會被扭曲變形,很開心老師幫我們解決了這個問題,而其他顯示圖片內容的信息,做法還是跟上次一樣,還是須靠維基百科的幫助,查詢BMP檔的位元組,維基在這幾堂課真的對我們來說很重要,他的重要度當然不只這樣,不過中文的維基資料就比英文的少了許多,老師還帶我們看了英文版的,所以一定要強迫自己看英文,最後我還是有個問題,就是顯示圖片信息的水平解析度和垂直解析度,有時候會出現"0"和圖片信息內容不符,但有時又可出現正確的。

2010年1月14日 星期四
HW4
這次的作業跟作業三差不多,只是當初問題卡再掃圖進來的時候必須再調校,之前遇到的問題在課堂上聽完老師講解後,就沒甚麼問題了。
接下來除了灰階就是自己加進去的東西了。
首先第一張圖,灰階轉換,這部分沒甚麼問題,效果看起來還不錯。
第二張與第三張圖是二值化,說穿了就黑白啦!但又跟黑白又有點不同,再底下的Toolbar可以看到,數值越大,黑色的比例就越多,相反的數值越小,白色的比例就越高。
第四張圖,LFP轉換,也就是所謂的低通濾波,這是之前影像處理學的,就把之前的程式碼也放進來用。
最後一張圖是邊緣偵測,本來我是想寫成反相,就是像底片那樣,但我筆記翻來翻去就是翻不到相關的資訊,但看到這個覺得挺酷的就把他加進來囉!
2010年1月12日 星期二
HW04
HW4

bPtrOriginalImage[j*3] = ctColor[0].bBlue;
bPtrOriginalImage[j*3+1] = ctColor[0].bGreen;
bPtrOriginalImage[j*3+2] = ctColor[0].bRed;
中少了
bPtrOriginalImage[j*3+2] = ctColor[0].bRed;
可能我複製的時候沒有複製到,難怪會無法執行,一開始我原本不知道這三行是什麼意思,後來老師有講解過在加上我去詢問過同學和上網查一查資料後才了解,接下來只要用for迴圈加上fseek和fread將圖片的色彩值讀出來就行了。再來就是PSPad,在資料結構的課有了解過,還可以利用PSPad來解除fackbook的封鎖,真的是個很方便的軟體呢!!!
上課學習的東西真是越來越多也越來越難,新的指令、新的程式碼、新的工具,只要一堂課沒去上課聽就會覺得很陌生,看來BCB軟體要花相當不少的時間去摸索摸索!!不然就會落後太多太多,同時寫程式的能力也會很差,所以得花很多時間去練習才能熟能生巧!!!!
HW4
這次與HW3的是差不多的,只是換成要讀取BMP檔裡面的每一點的值且顯示出來。
還有fopen,freed,fseek讀取RGB。
剛開始在想LoadFromFile跟單純fopen去讀每一點的值差在哪,發現用後面這方法,多了一點東西,多了這fopen難度多了一些,老師說過之前我們學C語言程式設計時,沒有教到這些東西,所以現在在來學,我覺得多學一點東西是對自己有幫助的,當然不亦樂乎。
這次作業第一次想到的是去讀每一點的值,程式做出來了,但是他讀好慢,之後老師有教一個ScanLine一次讀取一列的方法,好像快上許多,不過為了趕快交作業,有成品就趕快教出來囉!!
用下面:從右下角讀上來瞄點,若由上往下圖會上下顛倒
for(i=0;i
{
fseek (imBMP,offset,SEEK_SET);
fread (bSize, 1, 3, imBMP);
offset+=3;
Image1->Canvas->Pixels[i][j]=(TColor)RGB(bSize[2],bSize[1],bSize[0]);
}
想不到就好了,之後問同學才知道RAW檔儲存的順序是圖片的左下角到右上角!!!
大概是插這幾列程式碼,其餘的大部分都跟第三次作業一樣!!
所以只要解決這一項,就差不多完成了,但是我有必要在去練習一下,
如何用ScanLine來做,不然以後去職場遇到像素大一點的圖還在那邊一點一點讀,老闆都等到長白髮了。
<不過已經把拍的圖存成JPG檔了,上傳還是好慢阿阿~不過把圖用小畫家切一下快很多>
2010年1月3日 星期日
HW4

第4次的作業和第3次有點相似,但卻有點不同這次老師要我們讀取BMP的圖片,原本程式是用fopen的開圖方式改用另一種方式掃到畫布上。這種方式是要少出原本圖檔每個點的RGB值,在掃到畫布上。。
bPtrOriginalImage[j*3+2] = ctColor[0].bRed
bPtrOriginalImage[j*3+1] = ctColor[0].bGreen
bPtrOriginalImage[j*3] = ctColor[0].bBlue
上面的程式碼是這次作業要寫進去的東西,主要是要讓我們把RGB讀近進影像原件裡面。
這次的作業我們要使用pspad將圖片檔色彩值的位置都找出來再把影像內容顯現出來,還要使用fopen、fread、fseek抓取圖片的檔頭。
每次的作業都是慢慢進階的從第一次到現在第四次的作業,現在看來就像是一步一步慢慢前進。慢慢學習BCB的功能,不過常常因為一點點小錯誤可能程式碼一點打錯,或著指是因為"全形",就有可能會讓程式整個發生錯誤,看來要減短打程式的時間,抓bug的能力也要加強才行。
2009年12月30日 星期三
HW 4
這次的作業就是不使用開檔的方式 是去讀他的標頭檔資料把圖掃出來。這是第三次作業的延續,主要是使用這三個指令fopen、fseek、fread來開起圖片。就比使用LoadFromFile這個方式稍微有深度一點。在家研究的時候,我先去看老師網頁的範例程式,了解一下如何運用,比起直接用LoadFromFile讀取,使用fopen掃圖的時間就比較久一點點。這次有使用到PsPad,在資料結構的時候我們已經有用過了,所以一點也不陌生。
bPtrOriginalImage[j*3+2] = ctColor[0].bRed
bPtrOriginalImage[j*3+1] = ctColor[0].bGreen
bPtrOriginalImage[j*3] = ctColor[0].bBlue
這三行就是把R、G、B三色讀進去影像元件裡面,一開始我還不了解,後來去問了蔡宗甫這三行的意思我才了解,不一樣的開檔方式有不一樣的效果出現,可見BCB我還很不夠深入了解。
2009年12月21日 星期一
hw4
2009年12月20日 星期日
HW4
這是這次作業的程式設計,與前幾次不一樣的是我把某些功能編到主要工具列的工具選單裡,這樣可以讓程是看起來再簡單點,另外我把主要工具列的按鈕加上了快捷鍵,只要在按鈕名稱旁邊加上(&快捷鍵)就可以了。
這次的作業是要自己開圖檔,把BMP圖檔的資訊讀出來,再一個一個畫到影像元件裡,想了很久還是沒有頭緒,還是要借助範例程式的力量。但是程式打完執行時卻一直出錯,這讓我頭痛了大半天,範例程式裡:
delete imOriginal;
imOriginal = new TImage(this);
imOriginal->Parent = sbOriginalImage;
imOriginal->Left = 4;
imOriginal->Top = 4;
imOriginal->AutoSize = false;
imOriginal->Width = iImageWidth;
imOriginal->Height = iImageHeight;
imOriginal->Picture->Bitmap->PixelFormat = pf24bit;
imOriginal->Picture->Bitmap->Height = iImageHeight;
imOriginal->Picture->Bitmap->Width = iImageWidth;
這段 我把
delete imOriginal;
imOriginal = new TImage(this);
imOriginal->Parent = sbOriginalImage;
imOriginal->Left = 4;
imOriginal->Top = 4;
imOriginal->AutoSize = false;
刪去就可以執行了,真是神奇,不知道是因為我哪段程是沒寫好導致的,不過他能成功把圖畫出來真是讓我非常感動。
這是執行的成果,這一刻真是讓人欣喜諾狂,在這裡遇到了以前的問題,就是只要再載入圖片前滑鼠移到灰階轉換的那個影像元件裡,灰階轉換就會出問題,下像下面的圖片一樣。
最後是把那個影像元件的事件全部去除,才可以保證他不出問題。這樣就解決了長期衣來的問題,但是就沒辦法把灰階影像元件滑鼠指到的那格資訊給讀出來了,還滿可惜的,不過之後有辦法會再來把它完成。
隨著程式功能越來越多,介面的設計也越來越重要了,要善用各種工具來完成,BCB也越來越好玩了!
2009年12月15日 星期二
WH4

這次我第一次找到的圖,結果變這樣最後看了老師得講解才知道 每一橫列所需的byte數都對齊為
4 的倍數的狀況 所以才會發生這個問題

最後最後才完成了這艱難的功課,花了好長時間想老師給範例該怎麼使用,
bPtrOriginalImage[j*3] = ctColor[0].bBlue;
bPtrOriginalImage[j*3+1] = ctColor[0].bGreen;
bPtrOriginalImage[j*3+2] = ctColor[0].bRed;
一開始也不知道這三行在做些什麼,最後找了資料才知道,這是用來把她的RGB資料寫進去我的影像元件裡面,這資料好多有點看不懂,但是應該是這樣,這次作業雖然感覺跟上次很像,但是讀檔的方式完全不一樣,是一個特別的作業。
2009年12月10日 星期四
HW4
這次作業和第三次作業有些雷同,只是這次是要重新再畫出一張圖,這次跟上次不同的地方是將fopen的模式改成rb 而不是單純的r
STEP1
FILE* BMP_file = fopen(OpenPictureDialog1->FileName.c_str(), "rb");
STEP2
在取得決定 要畫的畫布大小
int start,BMP_Width,BMP_Height;
Image3->Height=Image1->Picture->Height;
Image3->Width=Image1->Picture->Width;
STEP3
將圖檔以二進制讀入抓取裡面得每個點的RGB值,將值取出來在畫到另外的Image去。
for(int x=BMP_Height;x>=0;x--){
for(int y=0;y
Image3->Canvas->Pixels[y][x]=RGB(bitSize[2],bitSize[1],bitSize[0]);
Application->ProcessMessages();
}
我的圖大小好像怪怪的...在學校可以用
Image3->Height=Image1->Picture->Height;
Image3->Width=Image1->Picture->Width;
不過回到家裡就不知道為什麼沒辦法用 真奇怪 囧

