菜鸟告急:怎样将位图像素数据读入数组??(vc++)

RobJack 2009-05-11 10:31:40
get_image(int x, int y, int Dx, int Dy, BYTE *buf)//矩形窗口数据读入一维数组,x、y、Dx、Dy分别为左上角起始坐标,图像宽度和高度

例如
for(i = 0; i < Dy; i++)
{
get_image(x, y + i, Dx, i, buf); // 读出一行数据

……
}

具体如何将位图的一行数据读出来呢?请给代码,不胜感激!!
...全文
302 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lucklizhan 2009-05-14
  • 打赏
  • 举报
回复
直接解析比较清楚一点
cau228charm 2009-05-14
  • 打赏
  • 举报
回复
这个函数的参数有问题吧
huguangdieying 2009-05-13
  • 打赏
  • 举报
回复
void bmpshift(void)
{
FILE *fp;
LONG i,j,MapHeight,MapWidth;

BITMAPINFOHEADER infoheader;
memset(&infoheader,0,sizeof(BITMAPINFOHEADER));


fp=fopen(".\\33.bmp","rb");


fseek(fp,14,SEEK_SET); //指针移动
fread(&infoheader,sizeof(BITMAPINFOHEADER),1,fp); //infoheader指向信息头 指针会移动
MapHeight=infoheader.biHeight;
MapWidth=infoheader.biWidth;

GLfloat r,g,b;

for(i=0;i<MapHeight;i++)
for(j=0;j<MapWidth;j++)
{
b=float(fgetc(fp));
g=float(fgetc(fp));
r=float(fgetc(fp));
if(infoheader.biBitCount==32)
fgetc(fp);

}

fclose(fp);

}可以读24位或32位的rgb数据
dujimache123 2009-05-13
  • 打赏
  • 举报
回复
BITMAPINFO * pBmpInfo;
BYTE * pBmpData;
BITMAPFILEHEADER bmpHeader;
BITMAPINFOHEADER bmpInfo;
CFile bmpFile;
CString strFileName;
CString strFilter = "位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*|";
CFileDialog dlg(TRUE,NULL,NULL,NULL,strFilter,this);
if (!dlg.DoModal() == IDOK) return;
strFileName = dlg.GetPathName();

/// 通过读取位图文件显示位图
if(!bmpFile.Open(strFileName,CFile::modeRead|CFile::typeBinary)) return;
if (bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
{
AfxMessageBox("read bmp header failed!");
return;
}
if (bmpHeader.bfType != 0x4d42)
{
AfxMessageBox("invalid file type!");
return;
}
if (bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
{
AfxMessageBox("read bmp infor header failed!");
return;
}
if (bmpInfo.biBitCount != 24)
{
AfxMessageBox("File is not 24 bit.Application doesn't support this kind of file!");
return;
}
pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFOHEADER)];
if (!pBmpInfo)
{
AfxMessageBox("memory error!");
return;
}
memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));
DWORD dataBytes = bmpHeader.bfSize - bmpHeader.bfOffBits;
pBmpData = (BYTE*)new char[dataBytes];
if (!pBmpData)
{
AfxMessageBox("memory error!");
delete pBmpData;
return;
}
if (bmpFile.Read(pBmpData,dataBytes) != dataBytes)
{
AfxMessageBox("Read bmp data failed!");
delete pBmpInfo;
delete pBmpData;
return;
}
bmpFile.Close();
CClientDC *pDC = new CClientDC(this);
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),0,0,bmpInfo.biWidth,bmpInfo.biHeight,0,0,bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);

doudouHuY 2009-05-13
  • 打赏
  • 举报
回复
方法1、自己解析bmp文件,分析bitmapheader获取位图信息,载入位图数据
方法2、直接将位图当做资源载入进来然后获取位图像素信息
chiwa737 2009-05-13
  • 打赏
  • 举报
回复
学习







-------------------------------------
http://slash-directx.blogspot.com/
TADICAN 2009-05-12
  • 打赏
  • 举报
回复
为什么不用Resource?
xsc2001 2009-05-12
  • 打赏
  • 举报
回复
这个还得看你的位图是8位还是24位的,不同的位图一个象素保存的数据大小不一样,你是要把象素弄到一个buf里?

19,464

社区成员

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

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