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月23日 星期三
HW3
目前程式對於開啟與儲存影像功能只對BMP檔案有效,JMP影像可以讀取,但儲
2009年12月22日 星期二
HW3
HW3
2009年12月21日 星期一
hw4
2009HW3
HW 3
不過在修改時不知什麼原因.......,
結果不見了@@?
嗯...很詭異的事件,所以我在重新PO一次。
以下為執行結果:
這次的作業是用 fopen,fread與fseek來做開BMP的圖檔
、讀取,且將其圖片的資訊SHOW在畫面中,相較於
之前作業所用的開檔程式,這的確是較為複雜些,
而這次作業需要注意的地方是:
在讀取解析度時,須將值除以39.37,
因解析度值須把公尺轉為"英吋",
多這步驟才為才為dpi值(dot per inch),
這次作業的fopen,fread,fseek,
需要多多留意寫法及用途,
因為之後的幾次實作中應該會應用上,
簡言之,第3次作業.......結束!!! ^^
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月17日 星期四
HW5
完成HW4後,改善了之前提到的要把欲讀取的BMP檔以更人性化的方式開啟
(註:之前是將入徑寫死在程式碼中 "C:\\Bitmap.bmp")
另外閒著沒事便把程式介面來個大翻修
以Pagecontrol統整所有功能,使程式操作起來較系統化
也加入了狀態列將滑鼠座標與即時色彩值顯示在狀態列上
然後,是這禮拜的作業 HW5 - 讀取GIF的調色盤資訊並顯示出來
查了一下GIF檔頭資訊的格式,一邊用PSPad開啟老師提供的金龜子(!?).gif比對
原來GIF檔頭資訊還真精簡
GIF標籤、制定版本、長寬與不知名的3bytes之後就是一目了然的調色盤
看到這裡,作業已經在腦袋裡完成了九成,
讀取3bytes的RGB而已沒什麼困難,只要將他顯示出來就好
顯示出來.... 怎麼顯示出來?!
翻了BCB提供的眾元件,似乎沒有調色盤模組之類的玩意兒...
難不成要我拉出256個Panel來上色?! 這方法蠢到自己都想撞豆腐自殺
VB曾經寫過元件陣列,雖然說操作起來蠻方便的
但是一來,BCB的元件陣列我不會用
二來,還是要拉出256個元件阿!!!
轉念一想,如果.. 用畫的勒?
一格一格一格畫出來.. 反正是程式畫,又不是我畫,感覺起來似乎可行
打開BCB,Set一個New space專屬於GIF 調色盤
開始順著感覺Key出填格子命令的程式碼
過程輕鬆愉快10幾行搞定,關鍵性的一Run...
唷~ 一次到位,絢麗奪目的256格調色盤
比對老師的調色盤後..
宣告收工,HW5破關
(翻新後程式介面)
HW5作業展示
這是從課程討論區抓下來的金龜子.gif檔案,開啟他
極致藝術,馬賽克完成
寫在最後面:本來還在想說要怎麼顯示GIF圖檔以及他的調色盤
要擠在同一頁?可是分開來感覺又降低關聯性
要另外開一個Pagecontrol?
拜託..這一加,控制開關得重新調整簡直是自討苦吃
最後要LoadFormFile時..咦 碰了?味瞎咪?
有求必應的辜狗大神告訴我.. 喔.. BCB要讀GIF要自訂套件喔...
那就這樣吧~
===================================
題目新增一項動作 - 調色盤依色彩亮度排序
聽到題目馬上直接想到使用陣列處理,然後再基礎的Sort比大小
雖然原先沒有用陣列去處理調色盤的顏色
不過將256個顏色assign給陣列不會太困難
剩的問題是亮度怎麼分析?
課堂上也有解答,乘以莫名其妙的數字轉灰階便是間接求出亮度
剩下就是將一團空想實現在BCB上
實際操作也沒問題,宣告幾個公用變數以供Sort元件存取Open元件所處理的色值
套上以前寫到爛的Sort方法
恩~ 成果看似跟老師的一樣
原本每格色彩之間沒有間隙,想說這樣還可以跟老師的範例做個區隔
不過看了看覺得都擠在一起好像不怎麼好看...
於是乎順手賞了它們一些個田埂,一個蘿蔔一個坑
果然是美觀了些~
除了從暗排到亮,另外生了一個從亮排到暗...
不過這沒啥好說嘴的就是,不過就大於變小於罷了....
開啟金龜子.gif Successful !!
依照亮度排序 - 暗 to 亮
依照亮度排序 - 亮 to 暗
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;
不過回到家裡就不知道為什麼沒辦法用 真奇怪 囧
HW4
這次作業與上次的大同小異,不過這次是要讀取BMP檔裡面的RAW值,並將它顯示出來。搭配之前所學的freed,fseek讀取RGB不是問題。
Program Name:SourceBMP
Version: 0.02 alpha
0.03 alpha(98.12.3更新)
編譯完成的程式檔可以從這裡下載
功能:
不透過LoadFromFile,直接讀取BMP圖檔的RAW值
修正:
(98.12.3) 修正fseek遇到控制字元問題,並將圖正確顯示
這個作業總共出現了兩種版本的程式寫法
第一種為「點讀取法」透過兩層for迴圈讀取每個點的RGB值
一開始實作時,一直出現個很奇怪的情況,顏色無法正確的顯示,後來查WIKI的資料才發現原來RAW的儲存方式不是RGB而是倒著回來的BGR,更改一下RGB輸出的方式就顯示正確了
翻文件同時也發現了RAW檔儲存的順序是圖片的左下角到右上角
之前一直不知道調色盤的作用,與老師討論過後才了解到調色盤是用來儲存整個BMP的顏色資訊索引值,可以應用在BMP檔的壓縮上面
BMP檔壓縮方法是假設有個圖有紅紅藍藍綠綠
傳統RGB方是個別存在54byte以後的空間,但這樣檔案會很大
透過索引值方式將紅藍綠存在54byte以後當成參考值
在原本存顏色資訊的地方指定索引值的位置再透過RLE壓縮法就能做到無損壓縮BMP
至於RLE是什麼?查WIKI的資料它叫「變動長度編碼法」直接解是太抽象我用例子解釋一下
假設有筆資料為AAAAABBBBCCCC總共需要13個位元儲存
RLE的方式為將資料改成另一種表示法
AAAAABBBBCCCC → 5A4B4C 只需要 6個位元就可以儲存了
再透過演算反解壓縮資料就能還原為原始資料
至於詳細的實作方式還在研究中
第二種為上次上課老師提到用ScanLine一次讀取一列的方式,比第一種方式快很多
原本的點搜尋法讀取大圖檔時非常的慢
98.12.03補充:
透過將fopen讀取指修正避免fseek遇到無法讀取的RGB值(控制字元)
這是原本的寫法fopen(“text.bmp”,“r”);
新的寫法為fopen(“text.bmp”,“rb”);
加了這個b讓fopen以binary的方式讀取檔案
用原本的r模式是以文字的方式讀取檔案
但是檔案中可能會遇到一些控制字元(例如空白等)
會造成讀取錯誤
所以之前第一次實做時才發生了fseek不會往下跳的情況
透過b模式強制fopen用二進位的方式讀取(直接讀資料不轉換字元)就可以順利讀檔正確了
2009年12月9日 星期三
HW 4
2009年12月8日 星期二
HW4
這次我打算開新的檔案...
請讀取一張BMP影像,並將其影像內容顯示於C++ Builder 的影像元件之中.
* 要先在檔案的Unit1.h內打上" #include
開始跑程式,就會發現一些錯誤,因為他找不到所要用的變數,所以就要一一的去除錯,就會發現是少了一個int 還是少了一個OpenDialog 還是少了一個Label
我那時就一個一個跑,就打出好要顯示的Label,看到我眼睛都要花了,不過每當有跑出一個就會想要再繼續,就會發現都要先給定int,其實只是Label名稱還有所要表是的東西不同,而運算方式都是一樣的
噢~我忘了!要記得先在Form1所做的File內多加一的開啟這張圖的路徑( MyOpenBMPFile1)喔!
不然就不能開圖嚕!
這次的作業其實應該早就要交了,但還是拖到現在才交,因為不知道要如何下手,所以就拖了兩個禮拜,直到上禮拜上課老師給我們範例程式,才知道所要表達的是什麼,也好讓我們從中學習,老師也說我們還是得自己多練習才會寫,因為以後出社會後不會有人給我們這麼好的範例程式.
HW4
我要交作業了!
有關於這次遲交的原因...
前兩次上課其實我就聽懂老師要我們寫什麼程式
老師也親自用PSPad示範如何找出Offset的位置
然後不要使用BCB內建的OpenPictureDialog
要自己一個Pixel接著一個Pixel的畫出要讀的圖檔
可惜我寫了好久...哀
就像組合語言一樣寫不出來
這次是利用老師提供的範例程式寫出來的
補上幾個需要用到的變數
也利用這次機會
我大概了解typedef的用法了
|
|
|
﹀
上禮拜下課留下來
有跟老師提到
我需要範例程式才寫得出來這件事
好像我大二之後
越來越有這樣的趨向
像是資料結構就不能像以前程設那樣
可以從第一行寫到最後一行
不過老師給範例
至少我能夠應用範例
只是不知道這樣是好是壞...
2009年12月4日 星期五
2009年12月3日 星期四
HW4
HW3
例:圖片的格式、高與寬、大小和解析度
檔案大小的開啟: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年12月2日 星期三
HW4
當jpg檔轉成bmp檔時,再打開檔案執行一次,就可以正確跑出水平解析度與垂直解析度。