MFC读取图片发送

CFile myfile;
        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

 

posted on 2011-05-08 18:43  风乔  阅读(672)  评论(0编辑  收藏  举报

导航