//一、要求將bmp檔案順時針旋轉90°,要求熟悉bmp的檔案格式及熟悉檔案操作
//解題思路如下:
檔案的組成此處不贅述,關鍵針對24位真彩圖
//檔案頭組成
class header //檔案頭
;/其中word等為自定義資料型別以配合文件說
typedef unsigned char byte; //byte為每個畫素的rgb類,數值在0~255
typedef unsigned int dword; //四個位元組
typedef unsigned short word; //兩個位元組
typedef long long; //四個位元組
資訊頭組成
class info //資訊頭
;這說明bmp高h,寬w,每個座標下(x,y)有乙個畫素,其中畫素有3個位元組,分別為rgb
讀寫檔案
int main(int argc,char* argv)
else
header fileheader;
info infoheader;
ifstream infile(src_name,ios::in|ios::binary);
if(!infile)
//首先將src.bmp的檔案頭和資訊頭讀入到記憶體的fileheader 和infoheader位置
//然後再進行旋轉操作函式
//旋轉函式的編寫
//首先要改變目標函式的檔案頭資料和資訊頭資料,這裡主要是檔案頭的bfsize即位**件的大小和資訊頭的biwidth \biheight\ bisizeimage
//其次要進行旋轉操作,即改變位圖旋轉90°後的資料儲存
//所以要先讀入位圖資料
//考慮到
//windows 規定影象檔案中乙個掃瞄行所佔的位元組數必須是 4 的倍數(即以字為單位),不足的以 0 填充,影象檔案中乙個掃瞄行所佔的位元組數計算方法:
//datasizeperline= (biwidth* bibitcount+31)/8;// 乙個掃瞄行所佔的位元組數
//即對於原始檔案,其每行的後面是有補零的,所以讀取時應跳過這部分
//ps:為什麼每行讀取位元組公式是這樣計算的呢?這是因為windows 規定影象檔案中乙個掃瞄行所佔的位元組數必須是 4 的倍數(即以字為單位),即每個掃瞄行/讀取的位數必須為32的倍數,向上取整,不足補零,所以要加上32-1,則datasizeperline= (biwidth* bibitcount+31)/32*4;
//則要計算每個掃瞄行的補零的位元組數
//一種寫法:
int getdiff(info & info)
//另一種寫法
int getdiff(info & info)
//接下來便是旋轉函式
template < class t >
bool trans(ifstream & infile,ofstream & outfile,header & header,info & info)
;class info //資訊頭
;class rgb24
byte red; //紅色的亮度(值範圍在0~255)
byte green; //綠色的亮度(值範圍在0~255)
byte blue; //藍色的亮度(值範圍在0~255)
};/*找到每行需要補0的位元組數 */
int getdiff(info & info)
template < class t >
bool trans(ifstream & infile,ofstream & outfile,header & header,info & info)
BMP檔案結構
1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...
BMP檔案結構
1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...
BMP檔案結構
平常我們常見的 bmp檔案即位 件,又稱dib裝置無關位圖,是相對於系統記憶體中使用的ddb裝置相關位圖而言的.一 位 件頭 bitmapfileheader struct bftype word 檔案標識,必須是 bm bfsize dword 位 件大小,以位元組為單位 bfreserved1 ...