如何访问HBITMAP中的图像数据

zephyr007 2006-08-21 02:38:49
如何访问HBITMAP中的图像数据,希望能够将其中的图像数据取出来进行其他的处理,至于格式可以是RGBRGBRGB...或RRRRRRGGGGGGBBBBBB等都无所谓
...全文
426 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
superarhow 2006-08-22
  • 打赏
  • 举报
回复
GetDIBits
zephyr007 2006-08-21
  • 打赏
  • 举报
回复
HBITMAP是个怎样的内存块?是否可以做如下强制转换:

HBITMAP hBitmap = LoadImage(...);
BITMAPINFOHEADER* pBIH = (BITMAPINFOHEADER *)hBitmap;

...
zephyr007 2006-08-21
  • 打赏
  • 举报
回复
HBITMAP中的数据存储顺序与Bmp文件一样吗?是否仅仅是相差一个BITMAPFILEHEADER
lixiaosan 2006-08-21
  • 打赏
  • 举报
回复
只要你知道了bmp文件格式,就知道他的数据是怎么存储的了

位图基本结构

位图文件头 BITMAPFILEHEADER
位图信息头 BITMAPINFOHEADER
颜色表
位图数据

你也可以参考以下链接
http://www.vckbase.com/document/viewdoc/?id=674
折腾_苏州 2006-08-21
  • 打赏
  • 举报
回复
贴上手头程序上一段,仅供参考:
BOOL CDib::Load(const char *FileName)
{
if(data!=NULL)
{
for(int k=0;k<m_row;k++)
{
free(data[k]);
}
free(data);
free(m_pBIH);
}
CFile f_image;
BITMAPFILEHEADER BFH;
LPBITMAPINFOHEADER pBIH;
BOOL YN=f_image.Open(FileName,CFile::modeRead);
if(!YN)
{
return FALSE;
}

m_dwDibSize=f_image.GetLength()-sizeof(BITMAPFILEHEADER);

int count;
count=f_image.Read(&BFH,sizeof(BITMAPFILEHEADER));
if(count!=sizeof(BITMAPFILEHEADER)||
BFH.bfType!=19778)
{
f_image.Close();
return FALSE;
}
bmpinfosize=BFH.bfOffBits-sizeof(BITMAPFILEHEADER);
m_pBIH=(LPBITMAPINFO)malloc(bmpinfosize);
count=f_image.Read(m_pBIH,bmpinfosize);
if(count!=bmpinfosize)
{
free(m_pBIH);
f_image.Close();
return FALSE;
}
pBIH=(LPBITMAPINFOHEADER)m_pBIH;
int col ,row;
col=pBIH->biWidth;m_col=col;
row=pBIH->biHeight;m_row=row;

byteperline=((long)pBIH->biWidth*(long)pBIH->biBitCount+31L)/32*4;

f_image.Seek(BFH.bfOffBits,CFile::begin);

data= (unsigned char**)malloc((row)*sizeof(unsigned char*));
unsigned char* tempdata=(unsigned char*)malloc(byteperline);
if (data== NULL)
{
f_image.Close();
return FALSE;
}
for(int i=row-1;i>=0;i--)
{
data[i] = (unsigned char*)malloc(col);
if (data[i] == NULL)
{
f_image.Close();
free(data);
return FALSE;
}

f_image.Read(tempdata,byteperline);
if(m_pBIH->bmiHeader.biBitCount==8)
{
memcpy(data[i],tempdata,col);
}
if(m_pBIH->bmiHeader.biBitCount==24)
{
for(int j=0;j<col;j++)
{
//data[i][j]=tempdata[3*j+2];
data[i][j]=(unsigned char)(0.59*tempdata[3*j]+0.3*tempdata[3*j+1]+0.11*tempdata[3*j+2]);
}
}

}
//修改BITMAPINFO
m_pBIH=(LPBITMAPINFO)realloc(m_pBIH,1064);
m_pBIH->bmiHeader.biBitCount=8;
m_pBIH->bmiHeader.biClrUsed=256;
m_pBIH->bmiHeader.biSize=40;
m_pBIH->bmiHeader.biHeight=row;
m_pBIH->bmiHeader.biWidth=col;
for(int j=0;j<256;j++)
{
m_pBIH->bmiColors[j].rgbBlue=j;
m_pBIH->bmiColors[j].rgbGreen=j;
m_pBIH->bmiColors[j].rgbRed=j;
m_pBIH->bmiColors[j].rgbReserved=0;
}
b_LoadData=TRUE;

free(tempdata);
f_image.Close();
return TRUE;

}
无聊客 2006-08-21
  • 打赏
  • 举报
回复
GetObject
goodboyws 2006-08-21
  • 打赏
  • 举报
回复
CreateDIBSection

19,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧