如何新建一个DIB文件,有没有大侠给个函数,我找了一个,但不知道用的对不对啊 最后输出的图像老是出问题。

解决方案 »

  1.   

    http://download.csdn.net/detail/wyqlxzl/3154643
      

  2.   

    用GDI+ 中的Bitmap或CImage类试试,可以直接保存成图片
      

  3.   

    这个是我在网上找到的代码,封装在我的CDibImage类里,用这个类创建24色图,biBitCount = 24,然后对第四部分数据直接输入RGB值,可以吗?谢谢啦
    HDIB CDibImage::NewDIB(long width, long height,unsigned short biBitCount)
    {

    long dwindth = (width*biBitCount/8+3)/4*4; //计算新建的DIB每行所占的字节数
    WORD color_num; //新建的DIB调色板中表项的数目 
       
        //通过输入的biBitCount值来确定调色板的表项数目 
    switch(biBitCount)
    {      
    case 1: //如果用1 bit来表示一个象素那么调色板中有两个表项 
     color_num=2;
    break;
       
    case 4: //如果用4 bit来表示一个象素那么调色板中有16个表项
    color_num=16;
    break;
       
    case 8: //如果用8bit来表示一个象素,那么调色板中得表项有256中(本程序大多采用这种形式)
    color_num=256;
    break;
       
    default: //其他的情况调色扳中没有表项,即真彩位图
    color_num=0;
    break;
    } //计算位图数据所占的空间
    //dwindth *height为象素数据所占的空间
    //40为位图信息头占的空间
    //color_num*4为调色板的表项所占的空间(调色板每个表项占4各个字节) long   dwBitsSize = dwindth *height + 40 + color_num*4; //建立指向位图文件的指针 
    LPSTR pDIB; //申请存储空间,并建立指向位图的句柄
    HDIB hDIB=(HDIB) ::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, dwBitsSize); //如果申请空间不成功返回错误信息
    if (hDIB == 0)
    {
    return NULL;
    } //如果申请空间成功锁定内存,并将内存的指针传给pDIB
    pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); //建立指向位图信息头结构的指针
    LPBITMAPINFO lpmf = (LPBITMAPINFO)pDIB; //给位图信息头内的各个参量赋值 //指定位图信息头结构的大小为40字节
    lpmf->bmiHeader.biSize = 40; //指定新建位图的宽度
    lpmf->bmiHeader.biWidth = width; //指定新建位图的高度
    lpmf->bmiHeader.biHeight = height; //位平面数必须为1
    lpmf->bmiHeader.biPlanes = 1; //确定新建位图表示颜色是要用到的bit数
    lpmf->bmiHeader.biBitCount = biBitCount; //是否进行压缩
    lpmf->bmiHeader.biCompression = 0; //新建的位图中实际的位图数据所占的字节数
    lpmf->bmiHeader.biSizeImage = dwindth *height; //指定目标设备的水平分辨率
    lpmf->bmiHeader.biXPelsPerMeter = 2925; //指定目标设备的垂直分辨率
    lpmf->bmiHeader.biYPelsPerMeter = 2925; //新建图像实际用到的颜色数 如果为0则用到的颜色数为2的biBitCount次
    lpmf->bmiHeader.biClrUsed = 0; //指定新建图像中重要的颜色数,如果为0则所有的颜色都重要
    lpmf->bmiHeader.biClrImportant= 0;   //如果新建的图像中含有调色板,则接下来对调色板的各种颜色分量赋初始值
    if(color_num!=0)
    {
    for(int i=0;i<color_num;i++)
    {
    lpmf->bmiColors[i].rgbRed =(BYTE)i;
    lpmf->bmiColors[i].rgbGreen =(BYTE)i;
    lpmf->bmiColors[i].rgbBlue =(BYTE)i;
    }
    } //解除锁定
    ::GlobalUnlock((HGLOBAL) hDIB); //返回新建位图的句柄
    return hDIB;
    }