• 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

  • 相关阅读:
    程序运行bug查看
    c# webbrowser 的html调用js出错
    c# dll使用注意
    支持ie的时间控件 html
    sql 条件插入
    软件自动更新原理
    c# 数组不能直接=,需要clone
    打包成exe程序
    逆袭大学
    Heritage from father
  • 原文地址:https://www.cnblogs.com/zzxap/p/2175692.html
Copyright © 2020-2023  润新知