关于DIB使用,图像新建 如何新建一个DIB文件,有没有大侠给个函数,我找了一个,但不知道用的对不对啊 最后输出的图像老是出问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://download.csdn.net/detail/wyqlxzl/3154643 用GDI+ 中的Bitmap或CImage类试试,可以直接保存成图片 这个是我在网上找到的代码,封装在我的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;} 菜鸟问题 逻辑坐标与设备坐标的区别 问一个问题 如何判断当前窗口句柄不是控件窗口(按钮控件,树型控件等等) 大哥们帮忙!在线等.关于enum CImageList的问题 请问!! 关于Windows Media Player控件. 写一个不超过100个连接的server socket,有几个方案... 更改视图的滚动条:cell组件已经有滚动条?想去掉视图的滚动条? 关于MFC的程序,启动就报错的问题。 请帮我编个数据转换程序
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;
}