資源簡介
本代碼是博客文檔bmp 轉YUV420數據組 C語言實現的配套代碼,

代碼片段和文件信息
#include?
#include?
#include??
#include?
#include?“bmp2dat.h“
#define?true??1?
#define?false?0
unsigned?char?*buffer_dat?=?NULL;
unsigned?char?*rgbBuffer?=?NULL;
unsigned?char?*yBuffer?=?NULL;
unsigned?char?*uBuffer?=?NULL;
unsigned?char?*vBuffer?=?NULL;
static?float?RGBYUV02990[256]?RGBYUV05870[256]?RGBYUV01140[256];
static?float?RGBYUV01684[256]?RGBYUV03316[256];
static?float?RGBYUV04187[256]?RGBYUV00813[256];
char?MakePalette(FILE*?pFileBITMAPFILEHEADER?*file_h?
BITMAPINFOHEADER?*info_h?RGBQUAD?*pRGB_out)??
{??
????//先判斷是否存在調色板:有效數據開始處離文件開頭的距離-位圖文件頭大小-位圖信息頭大小=調色數據大小??
????if?((file_h->bfOffBits-?sizeof(BITMAPFILEHEADER)-info_h->biSize)
==?sizeof(RGBQUAD)*pow((float)2info_h->biBitCount))??
????{??
????????fseek(pFilesizeof(BITMAPFILEHEADER)+info_h->biSize0);??
????????//把調色數據放到pRGB_out中,完成make?palette工作??
????????if(fread(pRGB_out?sizeof(RGBQUAD)?(unsigned?int)pow((float)2info_h->biBitCount)pFile)
!=?(unsigned?int)pow((float)2info_h->biBitCount))??
????????{??
????????????printf(“Failto?read?RGBQUAD!\n“);??
????????}??
????????return?true;??
????}??
????else??
????????return?false;??
}??
static?void?ReadRGB(FILE?*pFile?BITMAPFILEHEADER?*file_h?
BITMAPINFOHEADER?*info_h?unsigned?char?*rgbDataOut)??
{??
????unsigned?long?Loop?iLoop?jLoop?width?height?w?h;??
????unsigned?char?mask?*Index_Data?*Data;??
????int?shiftCnt;?
unsigned?char?index?;
//保證是圖像大小是4字節的整數倍,具體理由見下面的注釋??
????if?((info_h->biWidth%?4)?==?0)??
????????w?=?info_h->biWidth;??
????else??
????????w?=?(info_h->biWidth*info_h->biBitCount+?31)?/?32?*?4;??
????if?((info_h->biHeight%?2)?==?0)??
????????h?=?info_h->biHeight;??
????else??
????????h?=?info_h->biHeight+?1;??
???
????//若是24位,則bmp中有效數據大小是長*寬*3字節??
????//若是16位,則bmp中有效數據大小是長*寬*2字節??
????//若是8位,則bmp中有效數據大小是長*寬字節??
????//若是4位,則bmp中有效數據大小是長*寬/2字節??
????//若是2位,則bmp中有效數據大小是長*寬/4字節??
????//若是1位,則bmp中有效數據大小是長*寬/8字節(這大概是為什么bmp圖像的長必須是4的倍數,寬必須是2的倍數的原因吧。。。)??
????width?=?(w/?8)*?info_h->biBitCount;??
????height?=?h;??
???
????//倒序前數據緩存區??
????Index_Data?=?(unsigned?char*)malloc(height*width);//buffer大小應該與bmp中有效數據大小相同?
????
????//倒序后數據緩存區,用于存放bmp中的有效數??
????Data?=?(unsigned?char*)malloc(height*width);//buffer大小應該與bmp中有效數據大小相同??
???
????//文件指針定位到有效數據起始處讀取有效數據??
????fseek(pFilefile_h->bfOffBits0);??
??? printf(“file_h->bfOffBits?=?%d?\n“file_h->bfOffBits);
????if(fread(Index_Data?height*width?1?pFile)?>?height*width)??
????{??
????????printf(“readfile?error!“);??
????????exit(0);??
????}??
????//倒序存放??
????for?(iLoop=?0;?iLoop?????{
????for?(jLoop=?0;?jLoop? ????{??
????????Data[iLoop*width?+?jLoop]?=Index_Data[(height?-?iLoop?-?1)*width??
???
????????????+?jLoop];??
????}?
????}
????//24位:直接把數據復制給輸出緩存區??
????if?(info_h->biBitCount==?24)??
????{??
????????memcpy(rgbDataOutIndex_Data?height*wid
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????16865??2018-07-04?16:42??bmp2dat.c
?????文件???????1739??2018-07-04?15:57??bmp2dat.h
?????文件????????381??2017-12-14?15:10??Makefile
-----------?---------??----------?-----??----
????????????????18985????????????????????3
- 上一篇:基于Gabor特征的人臉識別
- 下一篇:C++ 幾何運算源碼
評論
共有 條評論