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

2010年1月12日 星期二

HW2

這堂課老師跟我們說了fseek,fread,fopen這三個重要的東西
後來就到維基和google去查
fseek 就像c語言中的fseek(fp,offset,SEEK_SET)函數成功則返回零失敗返回-1值
Fread (用於二進制文件)從文件指針handle讀取最多length個自節,讀取完length個字節數orEOF時就會停止讀取文件
Fopen 函式用來開啟本地或者遠端的檔案。檔案指標則指到伺服器傳回文件的起始處。開啟的 FTP 檔案可以是讀取或寫入其中之一,但不能讀或寫二種同時使用。其它的情形,本函式開啟本地的檔案,檔案的指標則指向開啟的檔案。若開檔失敗,則傳回 false 值。
字串參數 mode 可以是下列的情形:

'r' 開檔方式為唯讀,檔案指標指到開始處。
'r+' 開檔方式為可讀寫,檔案指標指到開始處。
'w' 開檔方式為寫入,檔案指標指到開始處,並將原檔的長度設為 0。若檔案不存在,則建立新檔。
'w+' 開檔方式為可讀寫,檔案指標指到開始處,並將原檔的長度設為 0。若檔案不存在,則建立新檔。
'a' 開檔方式為寫入,檔案指標指到檔案最後。若檔案不存在,則建立新檔。
'a+' 開檔方式為可讀寫,檔案指標指到檔案最後。若檔案不存在,則建立新檔。
'b' 若作業系統的文字及二進位檔不同,則可以用此參數,UNIX 系統不需要使用本參數。
了解完這三個F
就是開始打程式碼了
因為不是很會所以就跟同學一起討論但是,很多邏輯上的概念都跟同學一樣,可是打出程式碼的時候卻又不一樣,就run看看會過就是對的摟
程式碼裡要把讀出來的數值顯示出來就是把數值傳到某個lable的CAPTION這樣那個lable里的字就會顯示那個數值,這點跟VB一樣,剛開始接觸bcb真的會有點吃力因為記憶體的處理很嚴謹

2009年12月20日 星期日

hw02


這個作業用了很久,幸好同學用出來了,不然我還真的不會,這證明了我還要繼續加油才有可能學得好

2009年11月5日 星期四

HW3

           這是最一開始把圖片讀進程式內。

           第一個跳出的視窗顯示此圖片為BMP檔




這裡顯示出4串數字
           這張圖片顯示出它的大小佔用多少位元組。



           顯示此張圖片寬度由左邊圖片內容對照。



           顯使圖片的高度由左邊圖片內容對照。



老師這週交的內容,一開始程式碼打好之後,卻一直跑不出來,原來是前面忘了加上


stdio.h的標頭檔


後來在課堂上就已經慢慢弄懂了,因為老師有提供程式碼,


先告訴我們寬度如何去設定,讓它算出來然後顯示在視窗上,


主要用到fopen、fread、fseek。


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

這是主要的算法,當然高度也是一樣畫葫蘆就可以算出來了,後來老師在課程即將結束前又提供了另一種程式碼,告訴我們可以不需要寫這麼多,只要設定一些東西就可以讓它一樣算出我們想要的東西,但是下課時間一到心就飄走了,並不是很仔細的聽.....如果可以的話,希望老師上課時能再幫我們講解一遍。另外還很好奇的是,如果要讓圖片內容所呈現的資料,都顯示出來,那是不是後續的算法又變的不大相同?試著用自己的想法去打出一些程式碼,可是往往就是一堆bug.....我也知道只要有辦法自己除錯完成的話,那後面學到的就都是自己的了,可是偏偏邏輯思考能力還是略顯不足,要自己想出一串正確的程式碼還是顯得有些吃力.......
這是老師說需要把原本跳出視窗的資料一一顯示在介面上的,其實這個並不難,只要把"showmessage改成Label->Caption="就可以了,可是我發現了一個問題....解析度的公式就是之前bSize[0] + bSize[1] * 256 + bSize[2] * 256*256 + bSize[3] * 256*256*256;除39.37,可是我不管怎麼改程式碼顯示出的解析度,都不大對.....其他資料都正常顯示了....可是解析度就是怪怪的。













2009年11月4日 星期三

HW2

前兩週身體去檢查,照了胃鏡看了診斷報告,是胃潰瘍啊!
在此呼籲大家,正常飲食、多吃蔬果、少熬夜,免得跟我一樣。
醫生說再嚴重一點就是胃出血,要住院,且會提高罹癌機率。
請大家好好愛護身體。

接下來就是本週作業課題

目前,網路欠佳,圖片根本無法上傳。
(房東問題...且網路線被貓咬好幾個洞...傳圖會卡在上傳,就先打心得,日後補上)
因為阿吉的提醒,所以在上課的時候就把fopen、fseek、fread給搞定,老是忘了宣告辯數跟標頭檔,之類的壞習慣,一定要改過來。現在,關於BMP檔案的型態與內容都可數據化,因此在做各種BMP圖檔的轉換就更加明瞭。之前把老師交的黑白和灰階寫入同一個Form了,讓我有種在做影像編輯軟體的FU,但都忘了程式要放呆,有時超出限制,電腦就整個大當機,搞到我都快哭了。

再來就是我自己加進去的東西
加入了翻轉影像,水平翻轉與垂直翻轉
之前使用Image1->Picture->Bitmap->Width(Height)來了解影像的長寬,而我利用了I[x][y]與O[x][y]來代表翻轉前與翻轉後的影像在[x][y]像素的數值,0<=x<=Width-1,0<=y<=Height-1,
他們之間的垂直關係為
O[x][Height-1]=I[x][y]
而水平翻轉的關係為
O[Width-1][y]=I[x][y]

其中我是使用Canvas元件來處理
步驟是
1.產生新Bitmap元件
2.將TempBitmap指向這元件,因為要儲存轉後結果
3.將TheBitmap只向原始影像
4.將原始影像先複製到目的影像
5.利用Canvas執行翻轉
Width=TheBitmap->Width;
Height=TheBitmap->Height;
for(int y=0;y< Height;y++)
 for(int X=0;y< Width;x++)
 TempBitmap->Canvas_>Pixels[x][y]=TempBitmap->Canvas_>Pixels[Width-1-x][y];
6.在將結果傳回原始影像中
7.在去除TempBitmap指向的Bitmap元件

上述就是我的水平翻轉囉!!
感覺我根本就是在做小畫家,又回到我的專研題目了說.....

2009年10月26日 星期一

Homework2


這一次的作業二要將圖片轉灰階
雖然很早之前就在弄了
可是弄半天卻弄不出來
一直四處去問有學過BCB的同學
去看每一程式
找問題在哪裡
搞半天元在在一開始弄陣列就寫不對了
後面當然怎麼寫都沒反應
寫程式最怕寫了編譯會過但執行跟自己想要的畫面不一樣
因為編譯不過還可以有辦法除錯
但編譯過卻不是想要的令人頭痛啊~~
不過現在終於弄出來了~感到太不可思議了!!

HW2



這次作業 在詢問同學之後 終於寫好了
我覺得剛開始有點小麻煩 還好最後還是
比較了解 怎麼使用將彩色影像轉為灰階影像
所 以感覺很不錯 至少沒有空手回去的感覺 有學到一點東西了
其他的指令應該很快就會在學到了

2009年10月23日 星期五

HW2


聽了老師這幾週上的課後,對影像有了初步的認識,像是影像如何壓縮,影像如何組成等。
這次的作業是將彩色影像轉為灰階影像,程式方面並不會太複雜,利用公式就可,最後影像就可順利轉為灰階了,感覺還蠻有趣的。

HW2





心得:
這次的作業,並沒有很難,流程大致上是先把叫出來的圖片判斷出是幾位原色彩後,再轉換成灰階影像。前面先用switch判斷Pixel值,case轉換成文字幾位原色彩後,再來把之前圖片RGB的值+起來在除以3即可轉換成灰階影像,還算蠻OK的。上過幾堂課後,開始比較了解圖片在電腦中儲存方面的各種知識了,在枯燥的打程式中,加入了圖片影像學習,感覺就比較不會那麼無趣了,做完後看到成果也感覺比較有成就感,修課到目前的為止感覺還蠻不錯的,在繼續加油囉!

HW02

這次的作業是要把彩色圖片變灰階,並且把讀到的位元顯示出來,
一開始我有想到是把色彩值做變化,
想說是不是把得到的色彩值除以2就可以了,
我記得好像125是灰色的
是有這樣想 可是卻不知道如何下手,
要如何讀色彩值當時的我是一竅不通,
後來老師公布了片段程式碼,
咦~原來指令跟中文意思是一樣的,
GetRValue//取的紅色的色彩值
GetGValue//取的綠色的色彩值
GetBValue//取的藍色的色彩值
去讀每個點的RGB值,然後做些運算
開始 先得知圖片的長寬 因為每個像素就是一個X,Y
所以一定要使用FOR 迴圈來讀取每個像素點
一切都很順利可以讀到每一個點並且將其直存到node的變數裡頭
奇怪的是,圖片的顏色怪怪的,部分是灰階色彩,部分卻變成有如曝光般的顏色















以下是我的程式碼:
int X,Y,node;
for(X=1;X<801;x++) y="1;Y<601;y++)" node="(GetRValue(Image1-">Canvas->Pixels[X][Y])
//Pixels[X][Y]) 位於(X,Y)座標的像素
+GetGValue(Image1->Canvas->Pixels[X][Y])
+GetBValue(Image1->Canvas->Pixels[X][Y]))/2;
Image2->Canvas->Pixels[X][Y]=RGB(node,node,node);
}

吼~原來,因為一次是讀RGB三個點的關係,所以要除以3才對。
聽同學說 老師有講,喔不= = 我不是故意沒聽到的!!
可是最後作出來的時候,有種爽快感呢!!
















成功!!

2009年10月22日 星期四

HW2

大致上流程就是這樣

























雖然說是彩色圖片轉換為灰階圖片

但還是同樣為24位元的影像


在過程當中原本想說要把rgb調成黑灰色的組合


這樣感覺好像有點偷懶但事實上有夠難調整的

後來詢問同學才發現原來只要將原數值除3即可完成


但還是覺得有點疑惑但我想這應該是因為對於bcb的不熟悉

希望在未來幾週可以好好的熟悉這個平台

因為在這兩週的作業裡面我已經感受到bcb比平常用的vc++人性化一些

如果再未來能好好的修練成功 應該是項很好的武器才是

HW2

這次的作業是把彩色圖片轉換成灰階圖片,這是設計成品。











把RGB 三原色相加除以3就能實現灰階的想法了。
Gray=(GetRValue(Image1->Canvas->Pixels[X][Y])+GetGValue(Image1->Canvas->Pixels[X][Y])+GetBValue(Image1->Canvas->Pixels[X][Y]))/3;
過程中遇到點小問題,沒辦法顯示轉換過後超出範圍的部分,這讓我想了許多時間,最後是把Image2的大小再開檔時就定程Image1的大小,這樣才解決。












在這裡我一直想再轉換過後的圖也能塗鴉,想法是實現了,但是卻產生很多的BUG。像是先在Image2塗鴉過在載入圖片,就會發生圖片被放大的情況。思考了很久,最後還是放棄了這個想法。此外還遇到一個問題,就是如果執行程式後滑鼠移到了要轉換的那個影像元件上,他會自動變白,載入圖片後,就發生轉成灰階圖片只有看到的部分,其他部分還是空白的。這個問題我用了很久還是沒有解決。

HW2


這次的作業是把彩色影像變成黑白影像,雖然變成黑白影像但同樣是24位元,可能因為只是把每一個彩色的點的三原色照比例混和成黑白灰的顏色,所以基本上它仍然是一種"彩色"的影像。

HW2


這次作業 很直覺就想到一年級程式設計課時的內外雙迴圈方陣。
照著前幾堂課學到的,順序讀取圖片每個像素RGB總和除3化成灰階再覆蓋到另一張圖上,
要完成覺得沒想像中困難。
原本還在想,要開一個一樣大小的空白圖片,用來放置轉換好的像素色,
後來再想何必那嚜麻煩,直接讀取原圖再每個點覆蓋就好嚕哀。

不過完成後實際操作總感覺執行時間好久,在想說市面上的軟體應該不是這樣轉換的吶。
這想也對,畢竟只是仿其型... 期望能早日做到如同市面上那般成品。

碎碎念:因為自己的電腦還沒安裝好BCB,網路上找到的好幾個載點都是死掉的,
所以只能在上課前的午休時間趕緊來完成...
在編寫時候有股好大的慾望,尤其在遇到些意外的小問題時。
想說時間快到嚕,而反正同學也完成嚕參考一下馬上就可以解決,
最後好大定性才忍住,自己編完全部....
回去要快點找到有效載點哀~~


數媒HW2

這次的作業是把全彩的圖片轉換成灰階圖片
老師說其實公式很簡單
只要把RGB值相加起來再除以三就可以
也就是 -> (R+G+B)/3

這張是我轉換的結果
01

但是,這是色彩數比較少的圖片作轉換的情況下
如果把色彩數調高後再進行轉換結果會一樣嗎??
所以我又弄了幾張做實驗

02 03

04

05

看來,不論使用的是比較高色彩的繪圖圖片
或是真人照片都不會影響她的灰階變化

原來所謂的灰階照片就是這樣做出來的
那,相機裡面常見的除了灰階變化外
還有一種叫做負片效果
不知道那個是怎麼弄出來的?
我想應該差不多吧?

HW2

這次作業是把圖片轉成灰階儲存起來,而轉成灰階有兩種方法(R+G+B)/3和0.299*R+0.587*G+0.114*B,

怎麼看都是前面的加起來除以3比較好記,

所以在做的時候當然是選用這個方法來做,

一開始不知道怎麼把第一張圖轉到另一張圖,

後來只能用一點一點畫上去,然後就要先記錄第一張圖的長寬再一點一點抄過去,

圖像的格式因為上課有看老師做過了,所以這部份就比較沒有困難。



首先點擊Open會出現如上圖,選擇要開啟的檔案,



開啟完成會如上圖顯示,接著點選"轉換灰階"讓圖片依照上面所說的方法去轉成灰階。



完成會如上圖顯示。接著如下圖點選Save





最後會存在與開啟檔案的同一個資料夾內,如圖顯示,檔名固定為"PicGray.bmp"

HW2

此次程式作業目的把圖片轉換不同的位元和顏色,雖然在實做時候有點不知所措,不知道從何開始做起建立程式對話視窗。




親自實作邊看著BCB課本,遇到不少轉換圖片顏色問題,
如何把一張照片載入之後,再點選轉換按鈕,就可以得到想要招片轉呈灰色結果,
都需要去面對解決,建立能轉換圖片位元及顏色和按左鍵和右鍵的函數以及圖片和顏色對話窗與法。
只是稍微內部程式碼調整一下而已,但看似簡單的動作,實際上並不是如此
最後才了解到搭配在一起的功能和作用。
就跟小畫家程式一樣的實用感覺。

HW2

本週作業:
讀入一個 24-bit 彩色 .bmp 影像
並將其轉換成 8-bit 灰階影像儲存!


基本上沒太大的問題
要轉換成灰階的做法,課堂上提示的 (R + G + B) / 3便能搞定

但是仔細想想題目,8-bit 灰階影像,又會有點疑問
8 bit = 256色,儼然算是彩色的影像
但又為何會跟灰階影像扯上邊呢?

存在著這疑問同時,上網想找其他轉「8bit灰階」的做法時
碰巧查詢到直接指定PixelFormat=pf8bit,但是這樣的效果為











得知的確8 bit是能夠呈現不精緻的彩色影像
所以為何不是用2 bit灰階、4 bit 灰階,而是選用 8 bit 灰階呢?
是因為24 bit的 R + G + B 除以三就是等於 8 bit嗎?
寫完程式才又突然想到..
2 bist有4種顏色,無法構成彩色圖像
4 bits有16種顏色,就算能構成彩色圖像也很難看
而8 bits可以儲存256種顏色,色彩值雖多但無法達到精細

那反過來..如果不是存彩色,而是存灰階色彩
反而可以構成非常精細的灰階圖像呀~


以下配合截圖說明程式

1.啟動畫面













程式畫面由
MainMenu(Open、Save、Exit)、
GroupBox、
Image方框、
ScrollBox、顯
示圖片位元的Label、
轉換的Button、
Reset Button、
進度條
其中MainMenu的Save、Transform Button為不可使用;
Reset Button、進度條為隱藏


2.開啟Bmp圖檔














3.載入圖片













Load 影像至Image1、偵測影像的位元值、Transform Button設定為可使用



4-1. 開始轉換












顯示出轉換進度(一開始適用來Debug),Transform Button設定為不可使用


4-2.轉換中












加了一行Application->ProcessMessages();
讓程式不會有不回應的狀況,畫面從左而右依序轉出


5.轉換完成













轉換完成彈出Messeage視窗提示


6.Save影像













在Messeage視窗按下確定後,進度條恢復隱藏、Save為可使用、Reset Button顯示

此時若選擇Open載入影像,則會回到第三張截圖的狀態 (包含Save Disable、Display Transform Button、Image2 Clean)


7. 儲存的灰階圖檔











選擇Save後,會產生出一個Gray.bmp的灰階影像




另外以這張貓咪的Image為例,實際影像大小為480 x 360
而載入Image1的方框時,設定縮放80%(384 x 288)
在轉換時則須依照原影像大小操作
因此在轉換的過程中,灰階圖片會比原圖片來的大
若鎖定Image2方框大小(AutoSize為false),轉換後的影像會被裁切;
若設定AutoSize為True,轉換過程Image2的方框會擴大
因此拉了一個ScrollBox來放Image2,順利解決這個問題
但還是想要嘗試看看在轉換的過程中,能否直接同步顯示出縮放的影像,
而不用等到轉換完成後再縮放,不知道能用什麼方法達成?

HW2



本次作業是將一張24bit的彩色圖轉為灰階
所執行的結果,就是下圖所呈現的!上圖為介面圖示
上課所說的兩公式我把他抄了一下來
(R+G+B)/3  and  0.299*R+0.587*G+0.114*B
我採用的是 0.299*R+0.587*G+0.114*B
因為接兩樣都測試後發現(R+G+B)/3出來的結果比較黑顏色上區也別比較少
然後再利用for迴圈來一個一個pixel 轉為灰階下為部分程式碼
ProgressBar1->Position=0;
for(int x=0;x<=Image1->Picture->Bitmap->Width;x++)
{
for(int y=0;y<=Image1->Picture->Bitmap->Height;y++)
{
int color=0.299*GetRValue(Image1->Canvas->Pixels[x][y]) + 0.587*GetGValue(Image1->Canvas->Pixels[x][y]) + 0.114*GetBValue(Image1->Canvas->Pixels[x][y]);
Image2->Canvas->Pixels[x][y]=RGB(color,color,color);

}
ProgressBar1->Position++;
}
另外我還有加上進度表示軸ProgressBar1
以免在執行的時候像當掉一樣
但有一個小問題就ˋ當我執行完時假如image的大小比原圖小就會超出範圍不會自動縮小
試了好幾次都沒成功這還有待研究!!!


HW2


要把彩色的24bits的bmp檔轉成8bits的灰階圖片,事實上還真有點難搞,很多誤見我還是搞不清楚在做什麼,要一個一個的摸索,上課的專心度還是有待加強,,請教同學之後才得知,原來詼諧是把RGB除3之後公式:"(R+G+B)/3"或是 "0.299*R+0.587*G+0.114*B",影像就會變成灰階,不過還是花了不少時間弄,好像bcb也沒有很難只是有沒有心去打而已,程式出來的時候的成就感好爽。

hw2

這次的作業是把圖片由彩色轉為黑白, 一開始我有一個
想法,可不可以把RGB 的數字改成變成黑白色的數字然
後讓圖片直接變成黑白色,但是問了同學後, 他告訴我
不可以,後來原來發現是RGB各除以3,我想請問老師
這個想法是可以行得通嗎?我對BCB其實不是很了 解。
後來到同學家去學習怎麼做這次的作業 ,發現一點都沒
有想像中的難,步驟很少很簡單,但是我對裏面的程式
碼,還不是說很相當熟悉,跟c++比起來, 清楚很多
也比較容易懂,只要記得順序 ,再來記住程式碼的用途
,其實也是很 輕鬆寫意的。
下面是我這次做的作業,因為很多人都 PO程式碼,我
想應該都大同小異所以 只PO了完成版的作業。

下次上課希望老師能夠多講解程式碼裡面的意義,因為我對那個不是很熟悉,謝謝老師。