您的位置:首页 > 其它

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

2015-12-29 15:04 337 查看
最近在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);

在此要感谢在网上积极回答问题的各位,是你们让我成功的,不是看了各位的讲解,也不可能达到目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: