bmp(全稱bitmap)是windows作業系統中標準影象檔案格式:裝置相關位圖(ddb)和裝置無關位圖(dib),使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,在絕大多數應用中不採用其他任何壓縮。
bmp當中資料的色彩空間是rgb。
典型的bmp影象由以下四部分組成:
1. 位圖標頭檔案資料結構,它包含bmp影象檔案的型別、顯示內容等資訊
2. 位圖資訊資料結構,它包含有bmp影象的寬、高、壓縮方法,以及定義顏色等資訊。
3. 調色盤,可選。真彩色圖(24位)不需要調色盤
4.點陣圖資料,根據bmp點陣圖使用的位數不同而不同,在24點陣圖中直接使用rgb,而其他小於24位的需要在調色盤中顏色索引值。
bitmapfileheader資料結構:
typedef struct tagbitmapfileheader bitmapfileheader;
bitmapinfoheader資料結構typedef struct tagbitmapinfoheader bitmapinfoheader;
調色盤資料結構typedef struct tagrgbquad rgbquad;
程式初始化(開啟兩個檔案、定義變數和緩衝區等)2.讀取bmp檔案,抽取或生成rgb資料寫入緩衝區
關於第二步的具體操作:
3.呼叫rgb2yuv的函式實現rgb到yuv資料的轉換4.寫yuv檔案5.
程式收尾工作(關閉檔案,釋放緩衝區)
main.cpp
原圖#include
#include
#include
#include
#include
#include "bmp2yuv.h"
#define u_int8_t unsigned __int8
#define u_int unsigned __int32
#define u_int32_t unsigned __int32
int main(int argc, char** argv)
else
yuvfile = fopen(yuvfilename, "wb");
if (yuvfile == null)
else
// read file & info header
if(fread(&file_header,sizeof(bitmapfileheader),1,bmpfile) != 1)
if (file_header.bftype != 0x4d42)//4d42='bm'
else
if(fread(&info_header,sizeof(bitmapinfoheader),1,bmpfile) != 1)
// end read header
//24bit暫不用調色盤
/*rgbquad *prgb = (rgbquad *)malloc(sizeof(rgbquad)*(unsigned char)pow(2,info_header.bibitcount));
if(!makepalette(pfile,file_h,info_h,prgb))
printf("no palette!");*/
//開闢緩衝區
bmpbuf=(unsigned
char *)malloc(info_header.biwidth*info_header.biheight*3);
ybuf=(unsigned
char *)malloc(info_header.biwidth*info_header.biheight);
ubuf=(unsigned
char *)malloc(info_header.biwidth*info_header.biheight/4);
vbuf=(unsigned
char *)malloc(info_header.biwidth*info_header.biheight/4);
//讀取bmp資料,呼叫bmp2yuv函式進行轉換
while(fread(bmpbuf,info_header.biwidth*info_header.biheight*3,1,bmpfile))
for (i = 0; i < info_header.biwidth*info_header.biheight; i++)
for (i = 0; i < info_header.biwidth*info_header.biheight/4; i++)
//寫入yuv資料
fwrite(ybuf, 1, info_header.biheight * info_header.biwidth, yuvfile);
fwrite(ubuf, 1, (info_header.biheight * info_header.biwidth) / 4, yuvfile);
fwrite(vbuf, 1, (info_header.biheight * info_header.biwidth) / 4, yuvfile);
}/* cleanup */
free(bmpbuf);
free(ybuf);
free(vbuf);
free(ubuf);
fclose(bmpfile);
fclose(yuvfile);
return
0;}
bmp2yuv.cpp
#include
#include
#include "bmp2yuv.h"
int bmp2yuv (void *bmp,long width,long height, void *y_out, void *u_out, void *v_out)
以下只顯示了亮度訊號y分量
僅僅從亮度訊號就看得出,bit數較大的影象還原度就高
資料壓縮原理實驗4 實驗報告
一 實驗原理 1 編碼 利用信源相鄰符合之間的相關性 根據某一模型利用以往的樣本值對新樣本進行 然後將樣本的實際值與其 值相減得 到乙個誤差值,最後對這一誤差值進行編碼。如果模型足夠好,且樣本序列在時間上相關性 較強,則誤差訊號的幅度將遠遠小於原始訊號 從而得到較大的資料壓縮。2 dpcm編譯碼原理...
資料壓縮 實驗六 MPEG音訊編碼實驗
下圖為mpeg音訊編碼layerii流程圖 32個子帶濾波器組 通過子帶分析濾波器組使訊號具有高的時間解析度,確保在短暫衝擊訊號情況下,編碼的聲音頻號具有足夠高的質量。將pcm樣本變換到32個子帶的頻域訊號 如果輸入的取樣頻率為48khz 那麼子帶的頻率寬度為48 2 32 0.75hz 該多相濾波...
資料壓縮實驗七 MEPG音訊編碼
編碼器說明 輸入聲音頻號經過乙個多相濾波器組,變換到多個子帶。同時經過 心理聲學模型 計算以頻率為自變數的雜訊掩蔽閾值。量化和編碼部分用信掩比smr決定分配給子帶訊號的量化位數,使量化雜訊 掩蔽域值。最後通過資料幀包裝將量化的子帶樣本和其它資料按照規定的幀格式組裝成位元資料流。多相濾波器組,用來分割...