myfile.Open(filename,CFile::modeRead|CFile::typeBinary);
char buff[GetLength+1] = {0};
myfile.Read(buff,myfile.GetLength());
send(socket,buff,myfile.GetLength(),0);
读取RGB
void ReadBitMap( CString strFileName , int x , int y )
{
CFile file;
if(!file.Open(strFileName,CFile::modeRead|CFile::typeBinary))
{
return;
}
BITMAPFILEHEADER BitmapHead;
if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
{
return;
}
if(BitmapHead.bfType!=0x4d42)
{
return;
}
BITMAPINFOHEADER BitmapInfo;
if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
{
return;
}
if(BitmapInfo.biBitCount!=24)
{
return;
}
DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
unsigned char* pic_buf = (BYTE*)new char[dataByte];
BITMAPINFO* pic_pbmi = (BITMAPINFO*)new char[sizeof(BITMAPINFO)];
memcpy(pic_pbmi,&BitmapInfo,sizeof(BITMAPINFOHEADER));
int pic_rowSize = WidthBytes(pic_pbmi->bmiHeader.biWidth*24);
if(file.Read(pic_buf ,dataByte)!=dataByte)
{
return;
}
file.Close();
delete pic_buf;
}
pic_buf里存储的就是r,g,b值,buf[0] 是r,buf[1]是g,buf[2]是b的,这是第一个点的像素,下来buf[3] buf[4] buf[5]是第二个的,以此类推。
网上代码很多啊
C/C++ code
CFile cf;
if(!cf.Open(pathname,CFile::modeRead))
return false;
DWORD bitfilesize=cf.GetLength()-sizeof(BITMAPFILEHEADER);/////bitfilesize为除去文件头剩余文件的大小
unsigned char* pbitfile=new unsigned char[bitfilesize]; //////pbitfile指向了文件信息头的位置
if(!pbitfile) ////如果内存申请失败,就返回
return false;
BITMAPFILEHEADER bfh;
if(cf.Read(&bfh,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER) //文件头读取
/*||bfh.bfType!='BM'*/||(cf.Read(pbitfile,bitfilesize)!=bitfilesize)){//判断文件格式,和读取文件内容
::MessageBox(NULL,_T("ERROR"),NULL,MB_OKCANCEL);
delete []pbitfile; ///读取失败,就删除申请的内存
return 0;
}
if(m_pbmp!=NULL) /////防止多次载入图片,而导致内存的泄露
delete m_pbmp;
if(m_palette.GetSafeHandle ()!=NULL) /////同上
m_palette.DeleteObject();
BITMAPINFOHEADER *pbih=(BITMAPINFOHEADER*)pbitfile;////pbih指向了文件信息头
m_bitid=pbih; /////付给了成员变量,m_biid指向了文件信息头
m_prq=(RGBQUAD*)&pbitfile[sizeof(BITMAPINFOHEADER)]; /////取得palette的地址
m_paletteentry=1<<pbih->biBitCount ; ////判断
if(pbih->biClrUsed!=0) //判断是否实际应用了那么多的颜色
m_paletteentry=pbih->biClrUsed ;
if(pbih->biBitCount>8) ////判断是否是含有调色板
m_paletteentry=0;
m_pbit=pbitfile-(bfh.bfOffBits-sizeof(BITMAPFILEHEADER));////指向实际的数据文件
if(m_paletteentry){
LOGPALETTE *pLp=(LOGPALETTE*)new unsigned char[sizeof(LOGPALETTE)+
m_paletteentry*sizeof(PALETTEENTRY)];
if(pLp){
pLp->palVersion=0x300;
pLp->palNumEntries =m_paletteentry;
for(int i=0;i<m_paletteentry;++i){
pLp->palPalEntry[i].peRed =m_prq->rgbRed ;
pLp->palPalEntry[i].peBlue=m_prq->rgbBlue;
pLp->palPalEntry[i].peGreen=m_prq->rgbGreen;
}
}
m_palette.CreatePalette(pLp);
delete []pLp;
}
因为bmp图像每行所占字节必须是4的倍数,你必须根据图像的宽度自己算出每行所占的字节数,记为biBytesPerLine。
假定你已经找到了图像数据的起始地址为BYTE *biBits,用y代表第y行,x代表第y列,那么某点的rgb就为
r=biBits[y*biBytesPerLine+x];
g=biBits[y*biBytesPerLine+x+1];
b=biBits[y*biBytesPerLine+x+2];
unsigned char *pxtop,*pxbottom,*pxtemp;
BITMAP topBM,bottomBM;
HBITMAP tempBitmap;
if (TopBitmap!=NULL)
{
GetObject(TopBitmap,sizeof(BITMAP),&topBM);
maxx=topBM.bmWidth;
maxy=topBM.bmHeight;
pxtop=new unsigned char [topBM.bmHeight * topBM.bmWidthBytes];
GetBitmapBits(TopBitmap,topBM.bmHeight * topBM.bmWidthBytes,pxtop);
以上代码绝以可用,给你作一个参考。
我正在写的程序中拷的一段下来的。
主要是这一句:
GetBitmapBits(TopBitmap,topBM.bmHeight * topBM.bmWidthBytes,pxtop);
RGB跟显示模式有关。
24位:B(1Bytes)G(1Bytes)R(1Bytes)
32位:一个字节不用,BGR
16位的复杂一点。
//获取图像RGB
void CBmpDemoView::OnBmpHandleGray()
{
// TODO: Add your command handler code here
CDC *pDC=this->GetDC(); //获得设备上下文
//CRect m_rect;
//this->GetClientRect(&m_rect); //获得窗口客户区
COLORREF color;
BYTE r,g,b;
BYTE gray;
for(int i=0;i<m_BMInfo.bmWidth;i++)
for(int j=0;j<m_BMInfo.bmHeight;j++)
{
color=pDC->GetPixel(i,j); //获得颜色
r=GetRValue(color);
g=GetGValue(color);
b=GetBValue(color);
gray=(int)(0.38*r + 0.49*g + 0.1*b);//设置灰度颜色值
color=RGB(gray, gray, gray);
pDC->SetPixel(i, j, color); //用灰度颜色画点
}
}
不用CFile读,直接用LoadImage加载位图进一个内存DC,然后用GetDIBits或是GetBitmapBits读出位图进一个数组,用GetBitmap(&bmpx)获取位图信息,然后通过
rgb=y*bmpx.bmWidthBytes+x*(bmpx.bmBitsPixel/8)来获取每一个点在数组中的位置,x,y是点的坐标,rgb是B色,rgb+1是G色,rgb+2是R色.
我也问过这个问题,还谢谢大家的帮助!
http://expert.csdn.net/Expert/topic/2919/2919100.xml?temp=.7187616
还有
CBitmap bitmap;
BITMAP bm;
//.....//
bitmap->GetBitmap(&bm);
int bitmapsize=bm.bmHeight*bm.bmwidthBytes;
BYTE* px=(BYTE*)GlobalAlloc(GPTR,bitmapsize);//声明px数组,可惜是一维的
bitmap->GetBitmapBus(bitmapsize,px);
int rgb,x,y;
int PixelBytes=bm.bmBitsPixel/8;
for(y=0;y<bm.bmHeight;y++)
for(x=0;x<bm.bmwidth;x++)
{
rgb=y*bm.bmwidthBytes+x*pixelBytes;
px[rgb+0]...//读取R
px[rgb+1]...//读取G
px[rgb+2]...//读取B
}
在这里呢
http://expert.csdn.net/Expert/topic/2932/2932167.xml?temp=.8844263