日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gdiplus byte *数据转换为Bitmap类型图片

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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类型图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。