轉自 Bitmap 圖片格式並用 C++ 讀寫 Bitmap
1、Bitmap 圖片格式

每部分的具體內容就不展開了。要說的有兩點:
(1)調色板不是必須的,可有可無,有沒有調色板可以通過位圖文件頭的 bfOffBits 是否等於位圖文件頭加上位圖信息頭的長度來判斷。調色板這個問題也曾經導致我在用 C++ 讀取 BMP 的時候出錯,原因就是並不是每個圖片都沒有調色板的,我讀取的開始位置錯了。
(2)windows 的 BMP 是從最后一行開始讀的!這個問題曾經導致我在用 C++ 做圖像的旋轉時方向錯誤。
2、C++ 讀取 Bitmap 圖片
#include <stdio.h> #include <stdlib.h> #include <windows.h> typedef struct { BYTE b; BYTE g; BYTE r; }RGB; void imgOpr(RGB &a,RGB &b) { b.b=a.b; b.g=a.g; b.r=a.r; } int main() { BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; FILE* pfin =fopen("D:/1.bmp","rb"); FILE* pfout = fopen( "D:/2.bmp" , "wb"); //Read the Bitmap file header; fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin); //Read the Bitmap info header; fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin); //為簡化代碼,只處理24位彩色 int height,weight; height=0; weight=0; height=infoHeader.biHeight; weight=infoHeader.biWidth; if( infoHeader.biBitCount >= 1) { int size = height * weight; RGB img[height][weight]; RGB img2[weight][height]; fread( img , sizeof(RGB) , size , pfin ); //對圖片進行操作 int i, j; for (i=0; i<height; i++) for (j=0 ; j < weight ; j++ ) { //將數組 img 賦值給 img2 imgOpr(img[i][j],img2[i][j]); } //將修改后的圖片保存到文件 fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout ); fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout ); fwrite( img2 , sizeof(RGB) , size , pfout ); } fclose(pfin); fclose(pfout); return 0; }
