第一篇:多媒體信息處理課程設計報告--YUV文件轉換為BMP文件
目錄
摘要...........................................................................................................................................1 1 引言.......................................................................................................................................1 2 顏色空間概述.......................................................................................................................2 2.1 RGB顏色空間.................................................................................................................2 2.2 YUV顏色空間.................................................................................................................2 3 YUV 420采樣格式及其存儲方式......................................................................................3 4 YUV 轉換為RGB 以BMP位圖文件保存............................................................................3 4.1 YUV與RGB轉換關系....................................................................................................3 4.2 BMP圖像保存................................................................................................................4 5 結語.......................................................................................................................................6 參考文獻...................................................................................................................................6 附錄...........................................................................................................................................7
YUV文件轉換為BMP文件
xxx
摘要
本文首先對RGB、YUV顏色空間作了簡要的介紹,介紹了YUV 420采樣格式及其存儲方式。簡述了YUV 與RGB 的關系, 并且給出了換算公式。最后對YUV文件進行RGB轉換,以BMP位圖格式把結果保存。
關鍵詞:顏色空間;BMP;YUV;RGB 1 引言
顏色是人的視覺系統對光譜中可見區域的感知效果。它僅存在于人的眼睛和大腦中。為了準確地描述顏色, 必須引入色彩空間的概念。正如幾何上用坐標空間來描述坐標集合, 色彩空間用數學方式來描述顏色集合。常見的3 個基本色彩模型是RGB, CMYK 和YUV。
RGB(Red, Green, Blue)是計算機中最常見的色彩空間。它通過紅、綠、藍3 基色的相加來產生其他的顏色。由于其設備的獨立性, 它被廣泛應用于計算機圖形、成像系統和彩色電視之中。而CMYK(Cyan, Magenta, Yellow, Black)色彩空間,則是通過顏色相減來產生其他的顏色, 實現方便,它被廣泛應用于印刷工業。而YUV 或YIQ 或YCb-Cr 色彩空間則描述灰度和色差的概念, 由于易于實現壓縮, 方便傳輸和處理, 它被廣泛應用于廣播和電視系統。正是由于這一點, 它也被廣泛應用于計算機視頻和圖像處理之中, 如JPEG 圖像和MPEG 均使用YUV 作為存儲像素的格式。在獲得顯示硬件支持的情況下, 使用YUV 還可以減少和消 除色彩變換處理, 極大地加快圖像的顯示速度。顏色空間概述
2.1 RGB顏色空間
在色度學中,為了確切表示某一種彩色,采用亮度、色調和色飽和度三個基本參量。彩 色視覺是人眼對這個三個參量的總體感覺[1]。亮度是光作用于人眼所引起的明亮程度的感 覺。色調是反映了彩色的類別。也就是通常所說的紅,綠,藍等就指的是色調。色和度是指彩 色光所呈現彩色的深淺程度。對于同一中顏色的彩色光,彩色越濃,色飽和度越高。根據色度學的介紹,不同波長的單色光會引起不同的彩色感覺,但相同的彩色感覺卻可
以來源于不同的光譜成分組合。自然界中幾乎所有的顏色都能用三種基本彩色混合配出,在 彩色電視技術中選擇紅色、綠色、和藍色作為三基色。其他的顏色都可以用紅色、綠色和藍 色按照不同的比例混合而成。所選取的紅色、綠色和藍色三基色空間。簡稱為RGB顏色空 間。
2.2 YUV顏色空間
YUV 是一種基本色彩空間, 被歐洲的電視系統所采用。它被PAL(Phase Alternat ion Line), NTSC(Nat ional Television System Committee)和SECAM(Sequent ielCouleur Avec Memoire or Sequential Colorwith Memory)用作復合色彩視頻標準。其中Y 指顏色的明視度(Luminance), 即亮度(Brightness), 其實Y 就是圖像的灰度值(Gray value), 而U 和V 則是指色調(Chrominance), 即描述圖像色彩及飽和度的屬性。黑白系統只使用Y 信息, 因為U 和V 是附加上去的, 所以黑白系統仍能正常顯示。YUV 420采樣格式及其存儲方式 YUV 轉換為RGB 以BMP位圖文件保存
4.1 YUV與RGB轉換關系
RGB在計算機領域有著舉足輕重的地位, 由于色彩顯示器使用紅、綠、藍3 色來產生需要的顏色, 所以被廣泛用于計算機圖形和成像之中。
然而, 在處理現實世界的圖像時, RGB并非很有效, 因為它對所有顏色都用等長像素點的R、G、B 3色加以合成。這就使得每個像素在R、G、B 3個成分上擁有相同的像素深度和顯示分辨率。而且處理RGB顏色空間的圖像也不是最有效的。由于上述原因,很多地方采用YUV顏色空間。可以說在計算機領域, YUV 顏色空間同樣占據著重要地位。
RGB與YUV之間可以相互轉化。由RGB轉化的公式如下: Y=INT(16.5+(0.257R+0.504G+0.098B))Cb=INT(128.5+(-0.148R-0.291G+0.439B))Cr=INT(128.5+(0.439R-0.368G-0.071B))由上述公式可推導出YUV轉換為RGB公式如下:
R=1.1665*(Y-16.5)-0.0483*(Cb-128.5)+1.6455*(Cr-128.5)G=1.1665*(Y-16.5)-0.3922*(Cb-128.5)-0.8151*(Cr-128.5)B=1.1665*(Y-16.5)+2.0218*(Cb-128.5)-0.0013*(Cr-128.5)
4.2 BMP圖像保存
數字圖像在計算機中都是以文件的形式存儲和記錄的,一般的圖像文件主要包含文件頭、文件體、文件尾三部分。BMP圖像文件格式是Miscrosoft公司為其Windows環境設置的標準圖像文件格式。BMP圖像文件主要由位圖文件頭、位圖信息頭、位圖調色板和位圖數據四部分組成,其數據結構定義如下: 1.位圖文件頭: typedefstruct {
WORD bfType;DWORD bfSize;
//文件大小 WORD bfReserved1;
//保留字,不考慮 bfReserved2;
//保留字,同上 WORD DWORD bfOffBits;
//實際位圖數據的偏移字節數,即前三個部分長度之和
}HEAD;
2.位圖信息頭: typedefstruct {
DWORD
biSize;
//指定此結構體的長度,為40
LONG
biWidth;
//位圖寬 LONG
biHeight;
//位圖高
WORD
biPlanes;
//平面數,為1
WORD
biBitCount;
//采用顏色位數,可以是1,2,4,8,16,24,新的可以是32
DWORD
biCompression
//壓縮方式,可以是0,1,2,其中0表示不壓縮 DWORD
biSizeImage;
//實際位圖數據占用的字節數 LONG
biXPelsPerMeter;
//X方向分辨率 LONG
biYPelsPerMeter;
//Y方向分辨率
DWORD
biClrUsed;
//使用的顏色數,如果為0,則表示默認值(2^顏色
位數)
DWORD
biClrImportant;
//重要顏色數,如果為0,則表示所有顏色都是重要的
}INFO;
3.位圖調色板:
typedefstruct {
BYTE rgbBlue;//該顏色的藍色分量 BYTE rgbGreen;//該顏色的綠色分量 BYTE rgbRed;//該顏色的紅色分量 BYTE rgbReserved;//保留值
}RGBQUAD;BMP文件保存的詳細實現詳見附錄。轉換后BMP文件如下:
bmp2.bmp
bmp5.bmp 結語
這次課程設計實現了最基本的YUV文件轉換為BMP文件,對YUV 420的采樣格式及其存儲有了進一步的認識,對多媒體信息處理有了進一步的了解,對以后的學習有一定的幫助。這次課程設計有很大的收獲,在學習多媒體的道路上還要更加努力。
參考文獻
[1]盧官明,焦良葆.多媒體信息處理技術[M].人民郵電出版社,2011.[2] R.C.Conzalez編,阮秋琦等譯.數字圖像處理[M].電子工業出版社,2003.[3] 黎洪松.數字視頻處理[M].北京郵電大學出版社,2006.[4] 譚浩強.C語言程序設計[M].清華大學出版社,2006 [5] 周長發.精通Visual C++圖像編程[M].電子工業出版社,2000.附錄
附錄清單:
1.2.//bmp.h
#include
WIDTHBYTES(bits)(((bits)+31)/32*4)typedef unsigned int
DWORD;typedef unsigned char
uchar;typedef unsigned char
BYTE;typedef unsigned short
WORD;typedef long #pragma pack(2)typedefstruct {
WORD DWORD WORD WORD DWORD bfType;bfSize;
//文件大小 bfReserved1;
//保留字,不考慮 bfReserved2;
//保留字gf,同上
bfOffBits;
//實際位圖數據的偏移字節數,即前三個部分長度之和
LONG;bmp.h cjw.cpp }HEAD;#pragma pack()#pragma pack(2)typedefstruct { DWORD
biSize;
//指定此結構體的長度,為40
LONG
biWidth;
//位圖寬 LONG
biHeight;
//位圖高
WORD
biPlanes;
//平面數,為1
WORD
biBitCount;
//采用顏色位數,可以是1,2,4,8,16,24,新的可以是32
DWORD
biCompression;
//壓縮方式,可以是0,1,2,其中0表示不壓縮 DWORD
biSizeImage;
//實際位圖數據占用的字節數 LONG
biXPelsPerMeter;
//X方向分辨率 LONG
biYPelsPerMeter;
//Y方向分辨率
DWORD
biClrUsed;
//使用的顏色數,如果為0,則表示默認值(2^顏色位數)
DWORD
biClrImportant;
//重要顏色數,如果為0,則表示所有顏色都是重要的
}INFO;#pragma pack()typedefstruct {
BYTE rgbBlue;//該顏色的藍色分量 BYTE rgbGreen;//該顏色的綠色分量 BYTE rgbRed;//該顏色的紅色分量 BYTE rgbReserved;//保留值
}RGBQUAD;intBMPwrite(const char*filename,uchar* buffer,intwidth,int height){
intLineByte = WIDTHBYTES(width*24);uchar* image =(uchar*)malloc(height*LineByte);for(int i=0;i for(int j=0;j } image[i*LineByte+3*j+2]=buffer[(height-i-1)*width*3+3*j];image[i*LineByte+3*j+1]=buffer[(height-i-1)*width*3+3*j+1];image[i*LineByte+3*j+0]=buffer[(height-i-1)*width*3+3*j+2]; unsigned char header[54] ={ 0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0,54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0 }; longfile_size = width * LineByte + 54;header[2] =(uchar)(file_size&0x000000ff);header[3] =(uchar)(file_size>> 8)& 0x000000ff;header[4] =(uchar)(file_size>> 16)& 0x000000ff;header[5] =(uchar)(file_size>> 24)& 0x000000ff;header[18] = width & 0x000000ff;header[19] =(width >> 8)&0x000000ff;header[20] =(width >> 16)&0x000000ff;header[21] =(width >> 24)&0x000000ff;header[22] = height &0x000000ff;header[23] =(height >> 8)&0x000000ff;header[24] =(height >> 16)&0x000000ff;header[25] =(height >> 24)&0x000000ff; FILE *fp;if(!(fp = fopen(filename, “wb”)))return-1;fwrite(header, sizeof(unsigned char), 54, fp);fwrite(image, sizeof(unsigned char), LineByte*height, fp);fclose(fp); } free(image);return 0; //cjw.cpp #include #define WIDTH 176 #define HEIGHT 144 //轉換矩陣 doubleYuvToRgb[3][3] = {1,0, 1.4022,1,-0.3456,-0.7145,1,1.771,0};//轉換函數 int Convert(char *file, int width, int height, int n) { //變量聲明 int temp = 0; int x = 0; int y = 0; intfReadSize = 0; intImgSize = width*height; FILE *fp = NULL; unsigned char* yuv = NULL; unsigned char* cTemp[6]; char *BmpFileName=(char*)malloc(256*sizeof(char));intFrameSize = ImgSize +(ImgSize>> 1); yuv =(unsigned char *)malloc(FrameSize*sizeof(uchar)); //讀取指定文件中的指定幀 if((fp = fopen(file, “rb”))== NULL) return 0; //申請空間 //4:2:0 , 1.5倍長度 } fseek(fp, FrameSize*(n-1), SEEK_CUR); //SEEK_CUR=1,對應當前位置 fReadSize = fread(yuv, 1, FrameSize, fp); if(fReadSize { printf(“已超出文件中的幀數!”);return 0; } else { //轉換指定幀 cTemp[0] = yuv; //y分量地址 cTemp[1] = yuv + ImgSize; //u分量地址 cTemp[2] = cTemp[1] +(ImgSize>>2); //v分量地址 uchar *imgdata =(uchar *)malloc(height*width*3*sizeof(uchar));for(y=0;y < height;y++) for(x=0;x < width;x++) { //r分量,根據公式轉換 temp = cTemp[0][y*width+x] +(cTemp[2][(y/2)*(width/2)+x/2]-128)* YuvToRgb[0][2]; imgdata[y*width*3+x*3] = temp<0 ? 0 :(temp>255 ? 255 : temp);//條件判斷,像素值應該在0-255之間 //g分量 temp = cTemp[0][y*width+x] +(cTemp[1][(y/2)*(width/2)+x/2]-128)* YuvToRgb[1][1] +(cTemp[2][(y/2)*(width/2)+x/2]-128)* YuvToRgb[1][2]; imgdata[y*width*3+x*3+1] = temp<0 ? 0 :(temp>255 ? 255 : temp); //b分量 temp = cTemp[0][y*width+x] +(cTemp[1][(y/2)*(width/2)+x/2]-128)* YuvToRgb[2][1]; imgdata[y*width*3+x*3+2] = temp<0 ? 0 :(temp>255 ? 255 : temp); sprintf(BmpFileName, “%s%d%s”,“bmp”, n,“.bmp”);BMPwrite(BmpFileName,imgdata,width, height);free(yuv); fclose(fp); return n; } } void main() { char m[100];int n;printf(“選擇所要轉換的文件:”);scanf(“%s”,&m);printf(“請輸入要轉換的幀數:”);scanf(“%d”,&n);Convert(m, WIDTH, HEIGHT, n);//調用上面的Convert,獲取文件的第i幀 ,Convert(“foreman_qcif.yuv”, WIDTH, HEIGHT, i);strcat(m,n)連接2個字符串 } printf(“圖像轉換完成!n”); 文章標題:如何把WORD文檔轉換為演示文件 找文章到xiexiebang.com更多原創-(http://www.tmdps.cn/) 如何把WORD文檔轉換為演示文件 制作幻燈片大多數人習慣在PowerPoint環 境中,如果有一個現成的Word文稿講義,只需簡單的操作就可將其轉換成為一個PowerPoint演示文稿,PowerPoint和Word兩個軟件提供了這一功能。本文提供兩種轉換方法供選擇。 導入Word文檔 創建一個Word大綱文件,存盤。然后打開PowerPoint程序,單擊菜單欄上的“插入”,選“幻燈片(從大綱)”,在打開的插入大綱對話框中選中剛才存盤的Word大綱文檔,單擊[插入],這樣,Word大綱文檔就變成了PowerPoint演示文稿。二者的對應關系是:Word大綱文檔的一級標題變為PowerPoint演示文稿頁面的標題,Word大綱文檔的二級標題變為PowerPoint演示文稿頁面的第一級正文,Word大綱文檔的三級標題變為PowerPoint演示文稿頁面第一級正文下的主要內容,其余依次類推。這個途徑要求你在Word大綱視圖下編輯文檔,對于習慣于Word頁面視圖的朋友來說有些不太方便,那么請看下法。 直接創建演示文稿 如果你在Word的頁面視圖下已寫好了內容或者是以前用Word編的一篇文章,想把它們制成幻燈片,就可以在Word中應用“樣式”和快捷鍵來直接創建演示文稿。先解釋一下什么是樣式:樣式是Word中早就有的功能,只不過我們很少用到它,使用樣式功能可以使文檔的創建和管理易如反掌。樣式工具欄就在操作界面的左上端,通常都寫著“正文”兩個字。點擊右側的向下箭頭,會出現“標題 1、標題 2、標題3……正文”等內容。您還可以按住“Shift”鍵的同時點擊向下箭頭,看看會出現什么情況? 請先把你認為要作為一張幻燈片標題的地方選中,然后選擇“標題1”,其他也依次類推。然后在菜單欄上選擇“工具/自定義”,再在彈出的對話框中選“命令”選項卡,從左窗口中選“所有命令”,從右窗口中找到“PresentIt”命令。用鼠標左鍵按住并拖動“PresentIt”至Word的菜單欄或工具欄均可。用此快捷鍵可直接調用PowerPoint程序,并把當前的Word文檔直接轉換為PowerPoint演示文稿,以大綱視圖顯示。點擊“PresentIt”后你會發現,用標題1樣式定義過的標題全都作為獨立的一頁幻燈片。如果你沒給Word文檔定義樣式,點擊[PresentIt]后,PowerPoint會把文檔的每一段落作為一張幻燈片,是不是很簡單啊?以后你盡可以在你習慣的Word下編排文章,然后輕松地轉為PowerPoint演示文稿。 當然,你也可以把任何以前的Word文檔或你找來的文章轉換為你需要的PowerPoint演示文稿。文稿轉換好了以后,剩下的修飾想必你肯定自己會料理了。 《如何把WORD文檔轉換為演示文件》來源于xiexiebang.com,歡迎閱讀如何把WORD文檔轉換為演示文件。 1、首先打開CorelDRAW軟件,雙擊圖標打開或者右擊圖標;打開。 2、出現新建頁面,進入繪圖界面。 3、執行窗口;泊塢窗;對象管理器命令,在右側彈出的對話框可以查看圖層,你可以鼠標右擊,在彈出的快速列表中選擇新建圖層或者單擊泊塢窗底下的新建圖層按鈕,你希望所繪制的圖形導出幾個圖層就新建幾個圖層。 4、開始繪制圖形物件,我這里邊新建六個圖層,然后把繪制的不同物件放置在不同圖層中,當然圖層順序要搞清楚,跟PS一樣,對象管理器中的圖層在上邊的也會顯示在繪圖界面的頂層。點擊圖層頁面前邊的眼睛可以隱藏該圖層,以此方法來做檢驗。 5、單擊對象管理器中的+號圖標,可以查看圖層包含的詳細信息。如果圖層順序錯誤,還可以選中錯誤圖層里面的群組元素,將它移動到正確圖層位置,想要精細的psd分層文件的話,單擊群組前面的加號,一個個元素移動到其他新建的圖層里面,按shift鍵可選擇多個。 6、執行文件;導出,導出格式為PSD格式,即PS源文件格式,導出在選定的文件夾。 7、在彈出的轉換為位圖對話框中設置參數,分辨率復選框中勾選保持原始大小、顏色模式設置為RGB色、最重要的是在選項復選框中一定記得勾選保持圖層。 8、選擇導出圖片,右擊打開方式為ps,在PS里打開它就能看到我們在cdr軟件中對它所分圖層的操作了。上面說的圖層順序錯誤問題,當然,你是可以在這里面更改的,PS的圖層一目了然。 好范文:如何把WORD文檔轉換為演 示文件 制作幻燈片大多數人習慣在PowerPoint環境中,如果有一個現成的Word文稿講義,只需簡單的操作就可將其轉換成為一個PowerPoint演示文稿,PowerPoint和Word兩個軟件提供了這一功能。本文提供兩種轉換方法供選擇。 導入Word文檔 創建一個Word大綱文件,存盤。然后打開PowerPoint程序,單擊菜單欄上的“插入”,選“幻燈片”,在打開的插入大綱對話框中選中剛才存盤的Word大綱文檔,單擊[插入],這樣,Word大綱文檔就變成了PowerPoint演示文稿。 二者的對應關系是:Word大綱文檔的一級標題變為PowerPoint演示文稿頁面的標題,Word大綱文檔的二級標題變為PowerPoint演示文稿頁面的第一級正文,Word大綱文檔的三級標題變為PowerPoint演示文稿頁面第一級正文下的主要內容,其余依次類推。這個途徑要求你在Word大綱視圖下文檔,對于習慣于Word頁面視圖的朋友來說有些不太方便,那么請看下法。 直接創建演示文稿 如果你在Word的頁面視圖下已寫好了內容或者是以前用Word編的一篇文章,想把它們制成幻燈片,就可以在Word中應用“樣式”和快捷鍵來直接創建演示文稿。 先解釋一下什么是樣式:樣式是Word中早就有的功能,只不過我們很少用到它,使用樣式功能可以使文檔的創建和管理易如反掌。樣式工具欄就在操 作界面的左上端,通常都寫著“正文”兩個字。點擊右側的向下箭頭,會出現“標題 1、標題 2、標題3……正文”等內容。您還可以按住“Shift”鍵的同時點擊向下箭頭,看看會出現什么情況? 請先把你認為要作為一張幻燈片標題的地方選中,然后選擇“標題1”,其他也依次類推。然后在菜單欄上選擇“工具/自定義”,再在彈出的對話框中選“命令”選項卡,從左窗口中選“所有命令”,從右窗口中找到“Present It”命令。用鼠標左鍵按住并拖動“Present It”至Word的菜單欄或工具欄均可。用此快捷鍵可直接調用PowerPoint程序,并把當前的Word文檔直接轉換為PowerPoint演示文稿,以大綱視圖顯示。點擊“PresentIt”后你會發現,用標題1樣式定義過的標題全都作為獨立的一頁幻燈片。如果你沒給Word文檔定義樣式,點擊[Present It]后,PowerPoint會把文檔的每一段落作為一張幻燈片,是不是很 簡單啊?以后你盡可以在你習慣的Word下編排文章,然后輕松地轉為PowerPoint演示文稿。 當然,你也可以把任何以前的Word文檔或你找來的文章轉換為你需要的PowerPoint演示文稿。文稿轉換好了以后,剩下的修飾想必你肯定自己會料理了。 win7系統下怎樣把IFOX文件轉換為MP4文件 1、win7系統下設置顯示隱藏文件及文件名后綴 雙擊桌面的”計算機”,在(左邊)組織-》文件夾和搜索選項-》查看>高級設施選項里找“隱藏已知文件擴展名”前面的”“√”去掉。 2、win7系統下怎樣把IFOX文件轉換為MP4文件 點視頻文件,直接把IFOX為MP4就可以了。第二篇:如何把WORD文檔轉換為演示文件
第三篇:如何將CORELDRAW文件轉換為PS分圖層文件
第四篇:好-如何把WORD文檔轉換為演示文件
第五篇:win7系統下怎樣把IFOX文件轉換為MP4文件