資料壓縮實驗報告2 bmp轉yuv

2021-07-29 14:13:51 字數 2817 閱讀 8360

(1)bmp檔案格式

bmp(bitmap)是windows作業系統中的標準影象檔案格式,可分為裝置相關位圖(ddb)和裝置無關位圖(dib),使用十分廣泛。它採用位對映存貯格式,除了影象深度可選外,絕大多數無壓縮,因此所佔空間很大。bmp檔案的影象深度可選1bit,4bit,8bit,16bit及24bit。bmp檔案存貯資料時,影象的掃瞄方式是按從左到右、從上到下的順序,故rgb數值是倒敘的。

典型的bmp影象由四部分組成

其中位圖標頭檔案主要包括

typedef

struct tagbitmapfileheader bitmapfileheader;

位圖資訊頭主要包括

typedef

struct tagbitmapinfoheader bitmapinfoheader;

調色盤為乙個陣列,陣列的長度與主要包括biclrused和bibitcount有關,代表影象實際的顏色種類,真彩色(24bit)沒有調色盤,它主要包括

typedef

struct tagrgbquad rgbquad;

以24bit為例,以二進位制方式開啟檔案為

它採用大尾位元組序,故42 4d 實際為4d 42表示檔案型別為bmp,42之後14位元組為檔案頭;28之後40位元組為檔案資訊頭;真彩色無調色盤,檔案資訊頭結束之後為實際資料。

(2)轉換步驟

1.讀取rgb資料。在bmp檔案中不同畫素位數的檔案rgb的存貯方式不一樣,在24bit,32bit中無調色盤,直接讀取rgb資料;8bit中每乙個位元組表示一組rgb值,數值為調色盤的索引值,需根據索引值轉化為實際的rgb值;1bit時乙個位元組存貯8組rgb值,2bit乙個位元組4組,4bit乙個位元組2組,轉化為rgb值方法與8bit相同。

2.呼叫rgb2yuv函式,轉化為yuv資料。

3.將yuv資料寫到檔案中,生成yuv檔案。

(3)關鍵**分析

//32bit

for(i=0;i8;i +=4) //最高一位為alpha通道值,沒有用到

//24bit

memcpy(rgbdataout,data,info_h.biheight*info_h.biwidth*3);//直接定位到實際資料,拷貝
//1-8bit

rgbquad *prgb = (rgbquad *)malloc(sizeof(rgbquad)*(int)pow(2.0,info_h.bibitcount));//分配調色盤空間

if(!(makepalette(pfile,file_h,info_h,prgb))) //讀取出調色盤,如果沒有調色盤返回false

int index,mask;

for(i=0;i8;i++)

while(mask)

}if(prgb) free(prgb);

//讀調色盤

bool makepalette(file * pfile,bitmapfileheader &file_h,bitmapinfoheader & info_h,rgbquad *prgb_out)

else

return

false;

}

(4)實驗結果

bmp原始檔

yuv檔案

(5)結論

乙個自包含的檔案在檔案內容中就已經給出了對它進行操作所需的資訊,在運用中要根據檔案格式去把需要的資訊解析出來,再進行相關處理。

(6)完整**

void readrgb(file* pfile,bitmapfileheader & file_h,bitmapinfoheader & info_h,unsigned

char * rgbdataout)

break;

case

24://24bit

memcpy(rgbdataout,data,info_h.biheight*info_h.biwidth*3);

break;

case

16://16bit 555

if(info_h.bicompression == bi_rgb)

}break;

default://1-8bit

rgbquad *prgb = (rgbquad *)malloc(sizeof(rgbquad)*(int)pow(2.0,info_h.bibitcount));

if(!(makepalette(pfile,file_h,info_h,prgb)))

int index,mask;

for(i=0;i8;i++)

while(mask)

}if(prgb) free(prgb);

break;

}if(data) free(data);

}

資料壓縮實驗報告2 TGA轉YUV

寫在前面 由於大二上學習c 時沒有進行充分的練習,這次的實驗先是自己想了很久但是無果,最後只能參考同學的 看不懂的地方和同學討論並逐漸理解。感覺自己的情況就是知道大概的思路方法,但是不知道如何用 實現。在沒有參考的前提下沒法自己寫出完整的 還是需要多思考多練習。pga struct.h 用來建立pg...

資料壓縮實驗一 yuv轉rgb格式實驗報告

一 實驗基本原理 yuv轉 rgb格式轉換公式 r y 1.4020 v 128 g y 0.3441 u 128 0.7141 v 128 b y 1.7720 u 128 分析 由rgb到 yuv格式的轉換公式 y 0.2990r 0.5870g 0.1140b r y 0.7010r 0.58...

資料壓縮原理實驗4 實驗報告

一 實驗原理 1 編碼 利用信源相鄰符合之間的相關性 根據某一模型利用以往的樣本值對新樣本進行 然後將樣本的實際值與其 值相減得 到乙個誤差值,最後對這一誤差值進行編碼。如果模型足夠好,且樣本序列在時間上相關性 較強,則誤差訊號的幅度將遠遠小於原始訊號 從而得到較大的資料壓縮。2 dpcm編譯碼原理...