2010年1月18日 星期一
HK5
不過還是作業沒忙完
在上裡拜其中考期間
學校有舉辦一場ACA Photoshop的認證考試的課程
於是就報了名參加
今天剛上課就講了一堆
跟這學期的老師跟我們說的
解析度畫素跟像素
聽起來好熟悉教的跟老師上課的東西差不多~~
其中在教我們的到使用Photoshop
看到跟這一次的作業一樣的東西就是做圖片時
有看到旁邊有調色盤
看了就想起來這門課所教的東西
並且使用到的功能
都能依照亮度、色彩度跟對比值做排列
看到這些功能就想到BCB的作業還沒弄出來~~
雖然一直試著去弄
還是沒試成
不過今天在photoshop裡面聽了之後對調色盤有更深的認識了!
2010年1月16日 星期六
HW5
不過我也在WIKI學到一些GIF檔的資訊還不錯,原來GIF檔只能用在256色以下,不過在圖表上卻比JPG表現還要好,GIF檔當然還是有他獨特的優點。
HW5
HW5


我先去維基看了有關GIF的介紹,GIF是採用非破壞性的壓縮技術,只要檔案色彩不超過256顏色的話,檔案壓縮後都還是能完美輸出,不過主要不適用於真彩圖片。GIF有五個主要部分以固定順序出現,所有部分均由一個或多個區塊(block)組成。每個塊由第一個位元組中的標識碼或特徵碼標識。這些部分的順序為:頭塊、邏輯螢幕描述塊、可選的「全域」色彩表塊(調色盤)、各影像資料塊(或專用的塊)以及尾塊(結束碼)。
之前的作業都是希望我們把檔案的資料讀出,甚至是在上面畫線,變成灰階影像,這次是要在圖案上顯示出它的調色盤排列,我先去看了老師的程式碼,大概知道主要是先設定RGB,然後再去設立調色盤,可是我看不太懂這一行
float fLuminance[256];
imPalette->Canvas->Brush->Color = clWhite;
imPalette->Canvas->FillRect(Rect(0,0,323,323));
這邊的第二行我也是不太了解為什麼要設那四個值,
其實程式碼有些能在書裡面找到資料,只是有些還是沒辦法完全理解,弄了半天,我看同學們都說老師的程式碼還需要修改蠻多的地方,可是我弄了好久,還是不知道要怎樣做才能呈現出來,BCB雖然介面看起來很好上手,可是真正要去熟悉每個指令,還是要費好一番功夫,有些按鍵雖然知道要放上去,但是卻不知道要在裡面打怎樣的程式碼。
HW5
這次的作業是將老師的金龜子.gif圖的調色盤讀取出來再進行顏色排列。老師上課有講過,GIF檔的特色就是將一張圖片所需要用到的顏色直接編成一個調色盤。你用256色的就會有256個顏色,128的就是128,24bits的就是有24bits那麼多的顏色。調色盤決定後,圖片所有的顏色都會從調色盤取出。這樣的優點是可以縮減檔案大小,因為這樣就不用去記憶每個畫素點的顏色值了。但缺點是在顏色的顯示上會失真,不適用顏色太多的圖片。
看~就是那張圖!!(遙指)
基本上只要你不是色盲應該都可以很清楚的看到這張圖主要是由深綠色所組成的。他的其他部位則是有點帶點土黃色暗褐色的感覺。還有陰影部分就是黑灰白三色去配合出來的。
所以由程式解析他的調色盤就是以下這結果↘
最後再由明暗度排列會變成這樣
排列過後,較深較暗的顏色都在左上方。依序排列最右下方的就是最亮的白色了。
HW5
其實這個作業很早就在做了,只是一直都有一些bug在,所以才拖到這個時候
Program Name:SourceGIF V2
Version: 0.01 alpha
0.02 alpha
0.01 beta
功能:
0.01 alpha 讀取GIF的基本Header
0.02 aplha 嘗試讀取調色盤
0.01 beta 結合0.01與0.02的重製版,並加入排序功能
這個作業期時花了我不少時間
好不容易上個BMP搞懂了,這次換一個新的,又加上關於GIF的中文資料很少,只能翻閱英文資料。雖然說我的英文普普,但要再重新去了解與翻閱新的資料與名詞花了我不少時間。
之前第一次上GIF時,老師帶我們一起看wiki的資料,有了實做BMP讀檔的經驗,看完資料後馬上開始動手做
做到一半時突然有個問題
Header資料中的GCT是什麼東西?
那堂課就問老師這個問題
其實這東西是表示三個項目(M CR Pixel)
M表示接下來的GIF調色盤是否為獨立還是分開的(動畫時會出現)
CR表示調色盤的色彩解析度為多少?
Pixel則表示色彩的寬度為何?
那要如何取出? 只有一個Byte在儲存啊?
在老師的範例中
有一段程式碼有出現>>或是<<
這個代表向左或是又"平移"多少
以GCT這個來說,如果是全彩的話
這個位置通常會儲存F7
換算成二進位就變成 "11110111"
首先是M的部分
>>7代表的是向右移7格位置就變成00000001也就是1
CR的部分
<<1代表向左移動1個位置
>>5再向右移動5個位置
變成是00000111
最後是Pixel的部分
<<5向左移動5個位置
>>5向右移動5個位置
一樣變成是00000111
換句話說
這一個Byte裡面他表示了三個資訊
所以我們要用>>或是<<的方式取出它的值
有人可能會問說為什麼要這麼麻煩呢?
別忘了GIF是個用來壓縮全彩影像的的格式
如果說把這三個值分別儲存
變成會占用3個Byte
這樣就失去壓縮的意義了
既然1個Byte就可以會什麼不存得更小一點呢?
HW5
接著利用老師的範例程式,先補上老師範例程式該有的標籤,每個對應顯示出來的是GIF的檔頭資料,這是在wiki上查到的檔頭資料:
接著還要定義結構來存放檔頭的資料,例如這樣
typedef struct {
char cVersion[6];
Byte bScreenWidth[2];
還有一些<<和>>的,例如這個 bM = GIFHeader[0].bMCrPixel >> 7; 搞不太懂耶,希望老師能解釋囉。
最後是使用 crSortedPalette[k].bRed+crSortedPalette[k].bGreen+crSortedPalette[k].bBlue)/3
來比較大小。
順利做出來後,發現出來的結果跟老師放在網頁的圖片不一樣,後來詢問過同學後,將我原本的RGB順序改成 現在的BGR就會有跟老師一樣的結果了。
imPalette->Canvas->Brush->Color =(TColor)RGB(crPalette[k].bBlue,crPalette[k].bGreen,crPalette[k].bRed);
這是之前的結果:
我的排序是從亮到暗
不過我發現有一個點顯示不太一樣,有一個特別的點,是紅色的,你們有發現嗎?
不知道為什麼會這樣耶。
開其它圖片來玩玩~~
HW5

要上面這隻金龜子的顏色做出調色盤的色階出來。

這是老師的範例色階,在打入(crPalett[k].bRed+crPalette[k].bGreen+crPalette[k].bBlue)/3的值再用氣泡排序法就可以完成排序。感覺這次作業跟上一次有不一樣的變化。還有不懂的就可以上維基百科搜尋一下,雖然中文有些翻譯不是很棒。
HW5


HW5
不過我拿到改版的程式碼把一些元件拉完之後還是發現一堆錯誤,剛開始卡最久的大概是crPalette[i].bRed=0 ,我一直搞不懂bRed是怎麼去定義的,先去參考了之前灰階的調色盤發現沒幫助,決定先找找看Blog上其他同學有沒有碰到類似問題,其實大部分同學的hw5我都有稍微看過,發現大家還滿神的...原來只要稍微改一下元件的名稱然後用sort就行了?
不過終於發現有實際做的同學有跟我一樣的問題,參考了簡呈恩的方法後終於知道還要自己去一些定義結構才能使用老師的程式碼。
先把Label拉一拉和定義一些未定義的變數後,終於讓大部分的程式碼都可以跑,我才慢慢看每段程式碼,發現讀標頭檔那段有些我實在看不懂,類似 bCR=bCR >> 5; bCR=bCR+1; 這種 >>是什麼意思呢??
後來卡最久的其實是排序,因為看到老師有定義 float fLuminance[256]; 這變數來放色彩亮度,我直覺用這個來當做色彩亮度比較然後排序就可以了,沒想到怎麼排都不對,後來想到要排256次於是很開心設了迴圈馬上跑跑看,結果還是一樣...
不過很扯的是,我用了老師另外定義的crSortedPelette(拿來複製原本crPelette的RGB)
然後用(crSortedPelette[k].bRed+crSortedPelette[k].bGreen+crSortedPelette[k].bBlue)/3)來比較大小,這個我覺得不夠聰明的方法竟然就正確排序了? 老師設fLuminance還特地幫我們算出色彩亮度不就要方便拿來比較亮度嗎?
結果發現是我自己比較亮度之後只swap了crSortedPalette忘記交換fLuminance(在打完上面後突然想到 哈哈...),試過之後就成功能使用fLuminance這方法了,好吧,所以老師幫我們寫的一個好用的fLuminance來比較亮度!! 哈哈~~
在全部寫完之後載入金龜的圖才發現顏色不對?? 後來才發現原來是RGB位置放錯,一定是老師故意改錯要讓我們改 哈!
接下來就是展現成品的時候了!!
(1)讀取金龜圖
(2)讀取小畫家轉成GIF的圖檔
HW5
要讀取GIF調色盤
先從typedef下手,把要用到的變數都加到標頭檔
GIF的版本,長寬還有色塊等
第一次我寫這程式的時候
執行結果跟老師給的執行結果不一樣...
整個顏色都不一樣阿!!!!!!
然後就EMAIL問老師
老師說:
"你可以把讀到的色彩顯示出來,
再用 PSPad editor 看是不是讀正確了"
...
我大概是聽不太懂老師的意思
已經顯示出顏色了阿!!!
後來上課再問老師
原來是要把讀到的顏色的"值"顯示出來
比如說(255,255,255)是白色那樣
我就在程式底下加了一小段東西
看一下最前面幾個顏色
再比對一下正確的數值
果然!!是讀取到錯誤的數字
我沒有注意到GIF的色塊是"R->G->B->"這樣一直下去的
不像BMP那時候的4BYTE
會讀錯是因為我偷懶
直接把BMP的color struct給GIF用...
好吧 只好再生一個GIF專屬的調色盤
然後就成功了!!!
後來我也想要在程式上直接秀出整張GIF圖檔
看到部落格裡有人也想這麼做
可是他有提到要用到什麼元件之類的
就暫時不研究了!
2010年1月15日 星期五
HW5
雖然這次的作業一樣是跟影像的讀取有關,不過前面四次都是BMP檔,
而這次是讀取GIF檔,並且與BMP檔不太一樣的是GIF檔有調色盤,
所有會用到的顏色都會在調色盤上。
GIF最大的優點就是檔案不大,極適合在網頁上應用,
要是圖檔太大開啟一個網頁上的圖可是要等一段時間的,當然誰都不喜歡等。
不過其缺點是影像品質不太好,原因之一就是該圖最多也只有256色,
因此這並不適合在拍照上應用。
寫程式的部分我參考了老師的程式碼,不過也因為這是老師寫的,
有些地方看的不是很懂,比如像是個個變數所代表的意義等等,
而老師的程式中也用了不少的變數呢。
在畫調色盤的程式部分,程式架構就是用兩個迴圈去做,
就像之前讀取BMP檔,搭配fread與fseek使用,把讀到的像素點給一一印出;
讀取GIF調色盤也類似,把讀到的顏色畫出來,並把他畫成一個一個的方塊,
方塊與方塊間還可以留點空白好辨識;
再來調色盤畫好後還可以去按照顏色的明亮度或RGB值等等去做由小到大或由大到小的排序。
我覺得這次作業跟前面幾次比起來會比較困難些,因為還不熟悉GIF檔的格式,
雖然老師講得還滿清楚的,不過可惜的是老師講解與討論上只有一到二的禮拜,
花的時間也有點少,有點可惜,也讓我有點來不及吸收,
不過在聽老師的講解中其實我覺得GIF檔並不會比BMP來的多複雜,
只要再多花點時間去研究我有把握我能學得很好。
HW5

這是老師範例的金龜子
這是讀取圖片後讀出來的調色盤
讀取出圖片的顏色後接下來我們要讓它一照明暗來排序那要怎麼排序呢?
(crPalette[k].bRed + crPalette[k].bGreen + crPalette[k].bBlue)/3
把這程式碼打上去後會讀取出顏色的值
首先我們要把讀出來的值來比較她們的明暗,只是做大小比較而已。
之前的作業有交我們要怎麼讀出圖片的RGB值,這次的作業有點算是進階,我們要使用GIF裡面的色盤取出,在比較。
HW05
HW5

開啟PSPAD檢視 金龜子.GIF
0: 47 49 46
38 39 61 GIF89a Header
Logical Screen Descriptor
6: 03 00 3 - canvas width in pixels
8: 05 00 5 - canvas height in pixels
A: F7 - GCT follows (256 colors at 3 x 8 bits/primary)
B: 00 0 - background color #0
C: 00 - default pixel aspect ratio
R G B Global Color Table
D: 00 00 00 0 0 0 - color #0 black
10: 80 00 00 128 0 0 - color #1 dark red ("maroon")
: :
85: 00 00 00 0 0 0 - color #40 black
fseek(GIF_file, 13, SEEK_SET);
開始讀取顏色 繪製到陣列
for(int x=0;x<16;x++){ y="0;y<16;y++){">Canvas->Pixels[x+move_x][y+move_y]= RGB(bitSize[0],bitSize[1],bitSize[2]);
}
}
sort 由暗到明
color1 = RGB(GIF_R[i]*0.299,GIF_G[i]*0.587,GIF_B[i]*0.114);
color2 = RGB(GIF_R[i+1]*0.299,GIF_G[i+1]*0.587,GIF_B[i+1]*0.114);
將這兩個顏色比對,用泡沫排序法慢慢排列再次繪出,就結束了!
HW5
這次的作業也算是讀檔,
只是這次變成讀GIF,GIF的檔頭跟BMP比起來算是簡單很多,
GIF識別、大小尺寸、調色盤,
然後最後面塞個3B當做檔尾結束。
首先點選右上角的讀取GIF調色盤,
讀完之後會如上圖所示,
這還是未排序的。
點擊由亮到暗之後就會如上圖所示,
從最亮的開始排,
至於亮度是怎麼判斷的,
就是使用轉灰階的方式,
三種顏色各乘上特定數字加起來的結果去排序。
另一個按鈕由暗到亮,
做法一樣,只是改個順序而已。
這次作業其實不好寫,
一開始就算會讀圖也不知道怎麼畫出來,
看了老師的範例程式才知道要自己去弄一個間隔讓他隔開,
才不會擠在一起,也才變成跟老師圖上一模一樣的格式。
hw5
老師說過程式要一行一行打,一行一行理解,但是找資料的功力也是很重要的,有些人找半天都找不到,有些人半小時內就找到了,我記得我花了兩小時找資料。再來那本bcb也很有用,跟同學討論調色盤的元件要怎麼用,所以雖然做不出來,但是卻也有很多的收穫!!!



.jpg)


