開完BMP圖檔,這次要開的是GIF的調色盤,GIF的頭檔資料大致上就跟BMP差不多,讀取的方式也都大同小異,只要把他一個BYTE一個BYTE抓出來顯示就可以知道他頭檔的資訊了。一開始寫的時候就很直覺的依照Graphics Interchange Format 的格式去 fseek、fread,而不用結構的方式讀入標頭檔,就像BMP的讀檔一樣。就是參照維基百科裡訊息 :(Graphics Interchange Format)
===================================
byte# hex value Meaning
----- -------- ------ ----------------
0: 47 49 46 38 39 61 GIF89a Header
6: 03 00 3 - canvas width in pixels
8: 05 00 5 - canvas height in pixels
A: F7 - GCT follows
B: 00 0 - background color #0
C: 00 - default pixel aspect ratio
D: 00 00 00 0 0 0 - color #0 black
: :
: :
30A: FF FF FF 255 255 255 - color #255 white
==========================================
只要知道這些資訊要讀入GIF的頭檔就很簡單了。
以下是這次設計的程式:
這次的程式設計是把上次的程式增加功能,多了PAGE分頁,可以區分BMP和GIF的開檔。
想要用分頁的時候,一直沒辦法把全部的原件加到PAGE裡,用了好久才發現,我是根本沒放進PAGE過,因為我增加PAGECONTROL原件卻沒有NEW一個PAGE出來,所以導致放不進去。所有元件準備好後就要開始把調色盤讀出來了,這裡也和BMP一樣做了一個色盤結構。
typedef struct {
Byte bRed;
Byte bGreen;
Byte bBlue;
}GIF_Palette;
然後把讀取位置指到第14個BYTE的地方,把RGB個一區塊一個區塊的放入影像元件裡。
imPalette->Canvas->Brush->Color =(TColor)RGB(crPalette[k].bRed,crPalette[k].bGreen,crPalette[k].bBlue);
實驗品當然是老師的小金龜子囉,但是我讀出來的調色盤顏色卻出現了問題!!顏色跟老師的調色盤不一樣!?
真是令我震驚,後來發現原來是我得讀取位置設錯了,其實是第13個BYTE的位址。這才是真正的調色盤囉~然後就是題目要的顏色排序了。利用灰階的明亮度決定排序的方式。依照(crPalette[k].bRed + crPalette[k].bGreen + crPalette[k].bBlue)/3;的值大小排序,而方法當然用最直覺的氣泡排序法了,
不斷的比亮度然後交換,把大的直往上推,就可以達到排序的效果,也是最簡易的排序法。C++可以直接用swap函數來進行交換,不過想了想我是在交換結構,不能圖個便利只能自己寫了。
排序的Button按下去!!感動的時刻啊~
本來還想在程式裡開一個完整的GIF檔,但BCB沒有支援,上網查了些資料說是要使用到第三元件TGIFImage V2.2 。但由於找到的此第三元件只支援到BCB5和Delphi5, 而且支援BCB5的還有少許BUG,所以我就放棄研究了。
再來就是找別的GIF檔測試了 ,他的背景顏色還是黑色的呢!!
這次的作業讓我到網路上找了許多資料,因為想顯示GIF圖檔的關係,雖然最後放棄了,但也在查資料的過程中學到很多,也很充實。
A
回覆刪除