关于GDI+的那些事(2)——创建空白Image

来源:互联网 发布:牡丹江医学院网络答题 编辑:程序博客网 时间:2024/06/05 04:32

Image类应该是GDI+中最核心的一个类了。

但是它只有两种构造方式,FromFile or FromStream,从磁盘文件或流构造。

所以有时候,你想得到一个某尺寸的空白Image对象,都没有直接调用的方法。


这里提供一个在内存中直接创建image对象的方法。思路是先创建一个空白bmp图的Stream(因为所谓的Stream就是一个文件字节流),然后在此基础上产生Image。

注意,因为微软规定BMP格式图片,宽度必须为4的整数倍,所以假如弄出一个宽度非4整数倍的Stream,Image->FromStream是会出错导致无可用image指针的。

所以这个方法预先将宽度调为4的整数倍。


//凭空建立一副给定尺寸的白色image对象void CreateStream(int width, int height, IStream **ppStm){    CreateStreamOnHGlobal(NULL, TRUE, ppStm);    BITMAPFILEHEADER fileHeader;    BITMAPINFOHEADER bitmapHeader;    //Create Bitmap File Header    fileHeader.bfType= 0x4D42;    fileHeader.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + width*height*3;    fileHeader.bfReserved1= 0;    fileHeader.bfReserved2= 0;    fileHeader.bfOffBits= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);    //Create Bitmap Info Header    bitmapHeader.biSize= sizeof(BITMAPINFOHEADER);     bitmapHeader.biWidth= width;    bitmapHeader.biHeight= height;    bitmapHeader.biPlanes= 1;    bitmapHeader.biBitCount= 24;    bitmapHeader.biCompression = 0;//BI_RGB    bitmapHeader.biSizeImage= width*height*3;    //write data, white color    BYTE *data = new BYTE[width*height*3]();    for(int i=0; i<width*height*3; ++i)        data[i] = 255;    (*ppStm)->Write(&fileHeader, sizeof(BITMAPFILEHEADER), NULL);    (*ppStm)->Write(&bitmapHeader, sizeof(BITMAPINFOHEADER), NULL);    (*ppStm)->Write(data, width*height*3, NULL);    if(data)    {        delete data;        data = NULL;    }}void CreateImage(int width, int height, Image **ppimg){    //宽度不是4的整数倍时,自动调整    width = width/4*4;    IStream *pStm = NULL;    CreateStream(width, height, &pStm);    (*ppimg) =(*ppimg)->FromStream(pStm,0);    if(pStm) pStm->Release();}


0 0