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

2010年1月16日 星期六

HW4



原本前幾次作業讀取圖片是用BCB內建好的LoadFromFile
再讓我們對圖片做些修改應用
這次的作業更是要讓我們自己讀取圖片的資料,設法把他完整顯示出來

這次作業主要是在 fopen,fread,fseek 的應用
雖說已經練習幾次了,感覺還是用起來有點生疏,
果然還是拿別人用別人寫好的LoadFromFile簡單哀.... (苦笑

一樣是fopen, fseek 找到圖檔像素起始位置,然後再fread 從圖片RBG起始位置開始放入迴圈
依課堂上老師說的,要注意BMP檔得要讓邊長為4倍數,不然有些圖片會整個走樣
而且一直R.G.B.R.G.B習慣嚕,也還得注意BMP檔像素是依B.G.R這樣放進去
一沒注意圖片就會變得怪怪的,顏色一整個詭異....

HW4

這次作業是也是讀取讀片。可是跟第三次不太一樣的是,我們這次是用一個一個畫素點讀取在重新輸出的方式顯示。意思就是我們會從圖片檔的最左上方的畫素點開始讀取,讀一個就輸出一個。

HW4-1→像是這樣

這次也會用到上一次的那三個指令
一樣先用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-2
顯示結果上跟第三次作業大同小異,畢竟只是改了內部的讀取方式。
我們需要的顯示結果還是一樣的。

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);  
//讀B,G,R
offset+=3;
Image1->Canvas->Pixels[i][j]=(TColor)RGB(bSize[2],bSize[1],bSize[0]);
}


描點是從圖片的後面,也就是右下角開始瞄點,若從前面讀,圖就會顛倒過來,搞懂這個也花了我不少時間,不過也學到了不少東西,然後其它的部分就跟之前差不多了。

HW4

這一次的作業是要打開一個圖檔,然後讀出此圖片的資訊,其實大致上跟作業三差不多,只要再多加個幾行,就能完成了,但是一開始還是有碰到一些問題,畢竟FOPEN等東西依舊不太熟練,心裡想其實用LOAD FROM FILE也就OK了,何必使用這些東西呢,但既然有上次作業的程式碼可以繼續使用,於是便繼續參考了上周作業的內容

這次的作業大致上就是使用FSEEK將檔案的資訊讀出來,接著再用FREED讀取出來,前幾次作業讀出來的圖片都是直接顯示,誰知道這次的結果是慢慢得出來,感到比之前的結果有趣一些,希望未來可以學會更多的技巧,越來越熟練可以變出越來越多的花招

HW4


這次的作業是將上次以LoadFromFile的開圖檔方式,改成OpenPictureDialog->Excute(),開圖的方式就變成以點去掃圖,從左下角開始掃圖到右上角結束,而圖片的每個像素點是一個BGR組成,很神奇的是並不是RGB,所以這次掃圖的方式開圖檔會比之前的LoadFromFile的速度慢一些,而我也參考了老師的範例程式,註解非常詳細讓我一看就懂,這次多用了struct和unsigned宣告新的資料型態而unsigned還是第一次學,到靠近期末的資料結構課也用到了,使我更熟悉,老師這次也幫我們解決了圖檔高和寬不是4的倍數的問題,因為這次是每點去描圖,所以產生了LoadFromFile沒有的一個問題,如果圖檔高寬不是4的倍數整張圖讀出來會被扭曲變形,很開心老師幫我們解決了這個問題,而其他顯示圖片內容的信息,做法還是跟上次一樣,還是須靠維基百科的幫助,查詢BMP檔的位元組,維基在這幾堂課真的對我們來說很重要,他的重要度當然不只這樣,不過中文的維基資料就比英文的少了許多,老師還帶我們看了英文版的,所以一定要強迫自己看英文,最後我還是有個問題,就是顯示圖片信息的水平解析度和垂直解析度,有時候會出現"0"和圖片信息內容不符,但有時又可出現正確的。

上圖是出現錯誤水平解析度和垂直解析度

HW4

這次作業要用fseek,fread寫程式去讀圖片,這種方式是一個點一個點讀,所以讀取速度會比較慢,而且一些要設數字的地方都要注意,不然讀出來的圖片就會有錯。做完後,對圖片又了解了一些。

2010年1月14日 星期四

HW4

01 灰階02 二值化03 二值化微調04 LFP(低通)05 邊緣偵測

這次的作業跟作業三差不多,只是當初問題卡再掃圖進來的時候必須再調校,之前遇到的問題在課堂上聽完老師講解後,就沒甚麼問題了。

接下來除了灰階就是自己加進去的東西了。

首先第一張圖,灰階轉換,這部分沒甚麼問題,效果看起來還不錯。

第二張與第三張圖是二值化,說穿了就黑白啦!但又跟黑白又有點不同,再底下的Toolbar可以看到,數值越大,黑色的比例就越多,相反的數值越小,白色的比例就越高。

第四張圖,LFP轉換,也就是所謂的低通濾波,這是之前影像處理學的,就把之前的程式碼也放進來用。

最後一張圖是邊緣偵測,本來我是想寫成反相,就是像底片那樣,但我筆記翻來翻去就是翻不到相關的資訊,但看到這個覺得挺酷的就把他加進來囉!

2010年1月12日 星期二

HW04




趁著今天沒考試開始把作業做一做
不過做到這個時卻卡住了
因為距離之前有點時間了
所以我忘記fopen,freed,fseek這三個東西...
看到永祥有交出這作業
所以趁著下午去找他
請教他這題

原來跟直接開檔差異再描點的部分
跟第三個作業比較起來
主要差異在多了這一小段程式碼

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


這一次作業呢.....跟作業三相似,是要自己開圖檔,把BMP圖檔的資訊讀出來,程式碼只需要多個幾行就可以完成了!!!我從老師的範例程式中複製過來貼上後改一改我寫的方式,可是卻不能執行,害我一直找錯誤錯在哪....花費了不少時間,最後終於被我找到了!!!原來我的程式碼
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


做到hw4這裡其實已經感覺有點像小畫家了,就會有一股衝動想要把還有可以用的東西用好,出版自己的小畫家 哈哈哈哈 當然這是不可能的事 沒人要買這些只要有學過都知道的常識

所以現在我也想把這些基本的都學好,其實小畫家裡還有透明處理,色彩轉換,翻轉影像

先自己猜測

透明處理可能就是用一個百分比把多少個百分比的透明色平均分配在圖片裡面

色彩轉換就不大懂

翻轉影像 就直接把資料的位置資料變動可能就可以了

哈哈 以上我都是自己亂想

會找時間去維基好好的認真埋進去出來之後我就會有自己的小畫家了

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


啊!!我hw3的作業忘了寫標籤了= =

再來是我的第4個作業,這次的作業老師說要用pspad去檢查,可能所顯示的數值跟pspad的不同。不過檢查後有差一點點。這表示程式裡的計算有一點點問題嗎?還是差一點點沒關係不要差太多就好?這一次的作業大概沒問題了顯示好像都ok。



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也越來越好玩了!

hw04


這次作業還要用pspad去檢查,不然很容易搞錯,用了很久,終於把作業給用出來,知道怎麼用,可是實際用起來,真的有差

2009年12月15日 星期二

WH4

這次作業目的是要把圖一個一個圖進去檔案元件裡面,一開始我也是運用老師的範例檔來做,後來自己又改了一點,才可以完成執行,一開始自己寫的時候很多東西都會漏寫到,忘記寫INCLUDE就讓我除錯除了好久好久,最後詢問同學才知道,還有我一開始寫好還讀取不到檔案,然後自己想了好久才發現少了一行fread(BMPHeader, 14, 1, imBMP);




這次我第一次找到的圖,結果變這樣最後看了老師得講解才知道 每一橫列所需的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 fread(bitSize, 1, 3, BMP_file);
Image3->Canvas->Pixels[y][x]=RGB(bitSize[2],bitSize[1],bitSize[0]);
Application->ProcessMessages();
}

我的圖大小好像怪怪的...在學校可以用

Image3->Height=Image1->Picture->Height;

Image3->Width=Image1->Picture->Width;

不過回到家裡就不知道為什麼沒辦法用 真奇怪 囧