1. 範例程式:
DMC-2009F-SP03.txt
實驗結果
星期四, 11月 26, 2009
星期三, 11月 18, 2009
Week 09: BMP format (3)
第四個作業 (Homework 4):
請讀取一張 BMP 影像, 並將其影像內容顯示於 C++ Builder 的影像元件之中。
範例程式: DMC-2009F-SP04.txt
說明:
這個範例程式已經成功地解決同學們在課堂上, 如果沒有把 fseek 加入到迴圈中, 無法正確讀取影像內容的問題, 經過實驗發現, fread 從檔案中成功讀取資料後, 確實會自動將指標移到下一筆資料, 不需要我們用 fseek 指令設定; 然而, fread 會讀取失敗(傳回值為 0 ), 是因為在開啟檔案時, 必須設定開啟模式為"rb"。
因此, 如果要用上面的範例程式讀取一張彩色影像, 其寬度不是 4 的倍數時, 就會發生錯誤的情況。
以下是一張影像寬度為 250 的影像。
用本範例程式讀取出來的結果。
請讀取一張 BMP 影像, 並將其影像內容顯示於 C++ Builder 的影像元件之中。
範例程式: DMC-2009F-SP04.txt
說明:
這個範例程式已經成功地解決同學們在課堂上, 如果沒有把 fseek 加入到迴圈中, 無法正確讀取影像內容的問題, 經過實驗發現, fread 從檔案中成功讀取資料後, 確實會自動將指標移到下一筆資料, 不需要我們用 fseek 指令設定; 然而, fread 會讀取失敗(傳回值為 0 ), 是因為在開啟檔案時, 必須設定開啟模式為"rb"。
imBMP = fopen(OpenDialog1->FileName.c_str(), "rb");然而, 這個程式還沒有處理 bmp 在儲存處理影像時, 把每一橫列所需的byte數都對齊為 4 的倍數的狀況。假設, 一張 24-bit 彩色影像的寬度為 250, 每一橫列所需之記憶體為 250 * BitCount / 8 = 750, 那麼在存成 bmp 檔時, 每一行最後會補上 2 bytes, 一共需要 752 bytes。
因此, 如果要用上面的範例程式讀取一張彩色影像, 其寬度不是 4 的倍數時, 就會發生錯誤的情況。
以下是一張影像寬度為 250 的影像。
用本範例程式讀取出來的結果。
星期四, 11月 05, 2009
Week 08: BMP Format (2)
// 宣告一個資料型態 BMP_Header_TYPE,
// 其結構為 BMP 檔頭中, 有關 File Information 的部分
typedef struct {
unsigned char ucTyte[2]; // 固定為 'BM', 用以辨認是否為 DIB
unsigned char ucFileSize[4]; // 檔案長度
short sReserved1; // 固定為 0 , 保留未用
short sReserved2; // 固定為 0 , 保留未用
unsigned char ucOffset[4]; // 儲存圖像資料到檔頭的距離
} BMP_Header_TYPE;
// 宣告一個變數 Header[1], 其型態為剛剛宣告的 BMP_Header_TYPE
BMP_Header_TYPE Header[1];
// 宣告一個資料型態 BitmapInfoHeader_TYPE ,
// 其結構為 BMP 檔頭中, 有關 Bitmap Information 的部分
typedef struct {
unsigned char ucSize[4]; // 宣告圖像基本資料的大小 ( = 40 )
unsigned char ucWidth[4]; // 圖像的寬度, 以 pixel 為單位
unsigned char ucHeight[4]; // 圖像的高度, 以 pixel 為單位
unsigned char ucPlanes[2]; // 固定存入 1
unsigned char ucBitCount[2]; // 宣告每個 pixel 需要多少 bit 儲存
unsigned char ucCompression[4];
// 宣告圖像壓縮方式, 可能的值有 3 種 : 0, 1, 2
unsigned char ucImageSize[4];
// 影像大小, 以 Byte 為單位 ( W*H*BitCount / 8 )
unsigned char ucXPixelsPerMeter[4];
// 宣告圖像在 X 方向於 1 公尺有多少 pixel ,
unsigned char ucYPixelsPerMeter[4];
// 宣告圖像在 Y 方向於 1 公尺有多少 pixel ,
unsigned char ucUsedColor[4];
// 宣告圖像資料實際用到的顏色數目 ( 0表示用光 )
unsigned char ucImportantColor[4];
// 宣告調色盤中, 多少顏色在顯示時是重要的
} BitmapInfoHeader_TYPE;
// 宣告一個變數 BitmapInfoHeader[1],
// 其型態為剛剛宣告的 BitmapInfoHeader_TYPE
BitmapInfoHeader_TYPE BitmapInfoHeader[1];
// 宣告一個資料型態 Palette_COLOR_TYPE ,
// 其結構為 BMP 檔頭中, 有關 Palette 的部分
typedef struct {
Byte bBlue;
Byte bGreen;
Byte bRed;
Byte bReserved;
} Palette_COLOR_TYPE;
// 宣告 256 個變數 PaletteColors[256] 用來儲存調色盤的顏色,
// 型態為剛宣告的 Palette_COLOR_TYPE
Palette_COLOR_TYPE PaletteColors[256];
// 宣告 2 個變數; 儲存檔案結束控制碼
unsigned char ucFileEnd[2]; // 檔案的最後有 2 個 byte 的 0
參考程式
// 其結構為 BMP 檔頭中, 有關 File Information 的部分
typedef struct {
unsigned char ucTyte[2]; // 固定為 'BM', 用以辨認是否為 DIB
unsigned char ucFileSize[4]; // 檔案長度
short sReserved1; // 固定為 0 , 保留未用
short sReserved2; // 固定為 0 , 保留未用
unsigned char ucOffset[4]; // 儲存圖像資料到檔頭的距離
} BMP_Header_TYPE;
// 宣告一個變數 Header[1], 其型態為剛剛宣告的 BMP_Header_TYPE
BMP_Header_TYPE Header[1];
// 宣告一個資料型態 BitmapInfoHeader_TYPE ,
// 其結構為 BMP 檔頭中, 有關 Bitmap Information 的部分
typedef struct {
unsigned char ucSize[4]; // 宣告圖像基本資料的大小 ( = 40 )
unsigned char ucWidth[4]; // 圖像的寬度, 以 pixel 為單位
unsigned char ucHeight[4]; // 圖像的高度, 以 pixel 為單位
unsigned char ucPlanes[2]; // 固定存入 1
unsigned char ucBitCount[2]; // 宣告每個 pixel 需要多少 bit 儲存
unsigned char ucCompression[4];
// 宣告圖像壓縮方式, 可能的值有 3 種 : 0, 1, 2
unsigned char ucImageSize[4];
// 影像大小, 以 Byte 為單位 ( W*H*BitCount / 8 )
unsigned char ucXPixelsPerMeter[4];
// 宣告圖像在 X 方向於 1 公尺有多少 pixel ,
unsigned char ucYPixelsPerMeter[4];
// 宣告圖像在 Y 方向於 1 公尺有多少 pixel ,
unsigned char ucUsedColor[4];
// 宣告圖像資料實際用到的顏色數目 ( 0表示用光 )
unsigned char ucImportantColor[4];
// 宣告調色盤中, 多少顏色在顯示時是重要的
} BitmapInfoHeader_TYPE;
// 宣告一個變數 BitmapInfoHeader[1],
// 其型態為剛剛宣告的 BitmapInfoHeader_TYPE
BitmapInfoHeader_TYPE BitmapInfoHeader[1];
// 宣告一個資料型態 Palette_COLOR_TYPE ,
// 其結構為 BMP 檔頭中, 有關 Palette 的部分
typedef struct {
Byte bBlue;
Byte bGreen;
Byte bRed;
Byte bReserved;
} Palette_COLOR_TYPE;
// 宣告 256 個變數 PaletteColors[256] 用來儲存調色盤的顏色,
// 型態為剛宣告的 Palette_COLOR_TYPE
Palette_COLOR_TYPE PaletteColors[256];
// 宣告 2 個變數; 儲存檔案結束控制碼
unsigned char ucFileEnd[2]; // 檔案的最後有 2 個 byte 的 0
參考程式
訂閱:
文章 (Atom)