Gdiplus byte *数据转换为Bitmap类型图片
最近在mfc上顯示縮略圖那樣顯示采集到的圖片,這個用CimageList和CListctrl就可以了,網上有很多這里不細說,但是別忘了初始化Gdiplus;
但是我的相機采集到的就是byte類型的數據,一開始顯示的時候是先存到一個文件夾存為bmp又讀取的。這樣的話如果存的很多的話是不是讀取慢呢,我說的多是指整個盤里東西很多。然后我就想著直接轉換一下多好,但是在網上找了好久,試了不少方法都不行。
又是自己研究,通過研究發現Gdiplus::Bitmap bmp()竟然有12種構造方法,然后我就去找有沒有和byte*有關的,找到了個Bitmap(const BITMAPINFO *gdiBitmapInfo,void *gdiBitmapData),以我四級不過得英語看兩個參數是“位圖信息”和“位圖數據”。然后我自己試了下,因為我知道自己要顯示的byte*數據寬高800*800和顏色單色。
這是一個位圖信息指針,
BITMAPINFO* bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
這原來是用來把byte*數據存為bmp的函數,我又加了個位圖信息指針,如下邊紅色;
int SaveRawbmp(CString str,unsigned char *Databuff,int Width,int Hight)?
{
FILE *fp;
RGBQUAD rgb;
BITMAPFILEHEADER bmfHdr; // 位圖文件頭結構
BITMAPINFOHEADER bmfinfo;
//MessageBox(NULL,str,_T("標題"), MB_ICONEXCLAMATION);
//char Palette[4*256];
//unsigned char *tempBuff;
WORD PALLength8bit=4*256;
long PixelSize;
PixelSize= Width*Hight;
if((Databuff==NULL)||(Width<8))
return 0;
fp=fopen(str,"wb");
if(fp==NULL)
? ? ? ? ? return 0;
//初始化位圖文件頭數據
bmfHdr.bfType =0x4d42;?
bmfHdr.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+PALLength8bit+PixelSize;//文件總長度
while(bmfHdr.bfSize%4!=0)
{
bmfHdr.bfSize++;
}
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
//初始化位圖信息頭結構
bmfinfo.biSize=40;
bmfinfo.biWidth=Width;
bmfinfo.biHeight=Hight;
bmfinfo.biPlanes=1;
bmfinfo.biBitCount=8;
bmfinfo.biCompression=0;
? ? while(bmfinfo.biWidth%4!=0)
{
bmfinfo.biWidth++;
}
bmfinfo.biSizeImage=(bmfinfo.biWidth*bmfinfo.biBitCount/8)*bmfinfo.biHeight;
bmfinfo.biXPelsPerMeter=0;
bmfinfo.biYPelsPerMeter=0;
bmfinfo.biClrUsed=0;
bmfinfo.biClrImportant=0;
??
? ? //把生成的位圖寫成文件
fwrite((LPSTR)&bmfHdr,1,sizeof(BITMAPFILEHEADER),fp);//寫文件頭
fwrite((LPSTR)&bmfinfo,1,sizeof(BITMAPINFOHEADER),fp);//將位圖信息頭結構寫入文件
if(!bitmapinfo)
? ? {
? ? ? ??
? ? ? ?return 0;
? ? }
bitmapinfo->bmiHeader =bmfinfo;
? ?for(int iIndex=0;iIndex<256;iIndex++)?
? ? ? ? {?
? ? ? ? ? ? ? ? rgb.rgbBlue=iIndex;?
? ? ? ? ? ? ? ? rgb.rgbGreen=iIndex;?
? ? ? ? ? ? ? ? rgb.rgbRed=iIndex;?
? ? ? ? ? ? ? ? rgb.rgbReserved=0;?
bitmapinfo->bmiColors[iIndex].rgbBlue=iIndex;
? bitmapinfo->bmiColors[iIndex].rgbGreen=iIndex;
? bitmapinfo->bmiColors[iIndex].rgbRed=iIndex;
? bitmapinfo->bmiColors[iIndex].rgbReserved=0;
fwrite(&rgb,1,sizeof(RGBQUAD),fp);?
? ? ? ? }?
//file.Write((LPSTR)Palette,4*256);//將位圖顏色表數據寫入文件
fwrite((LPSTR)Databuff,1,Width*Hight,fp);//將位圖像素數據寫入文件
?
? ?/*把BMP位圖信息頭中的數據讀取到位圖信息結構中去.*/
fclose(fp);
return 1;
}
這就是生成了一個Bitmap類型的變量,bitmapinfo是位圖信息,包含寬高顏色等,這個我是根據自己知道的寬高和顏色自己寫出來的,part_image就是byte* 的圖片數據。要注意的是顏色這,位圖信息結構體中的bmiColors[1]是個很奇怪的定義,只有一個元素?顯然不是這樣的后來找到了如何賦值的方法,雖然不知道為什么,但是這樣做的確是對的。
? Bitmap img(bitmapinfo,(LPSTR)part_image);
在此要感謝在網上積極回答問題的各位,是你們讓我成功的,不是看了各位的講解,也不可能達到目的。
總結
以上是生活随笔為你收集整理的Gdiplus byte *数据转换为Bitmap类型图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010打开项目提示未能正确加载解决
- 下一篇: 无限网络无限连接掉网的解决