解决方案 »

  1.   

    是这样的::急急急,求助!!!!在摄像头拍摄出来的图片上画V型的线,并且在保存图片后,V型线可以保留在图片上。
    1.在图片的原始RGB数据中修改在V型线上的每一点的像素值,一条线为蓝色,一条线为红色。
    2.写一个函数,函数的参数有六个,第一个是原始RGB数据的地址,第二个和第三个是图片的宽和高,后面三个参数是V型三个点的位置,类型是CPoint。
    3.函数的具体实现:???
    4.函数的调用是在原始RGB数据写入图片文件之前,将参数传入。
      

  2.   

    大概就是一个二维矩阵与线性地址转换的问题
    按 y = kx+b 逐点移动X 获得y , 然后使用x,y计算出线性地址(要考虑对齐问题), 替换相应的像素数据(BMP的记忆中好像是BGR)还有可以创建DC 和位图 按GDI的方法绘制
      

  3.   

    就是说k和b的值得先求出来?然后根据x得到y或者根据y得到x?线性地址怎么算?就想在这函数中不创建DC和位图能直接替换掉相应的像素值吗?有可参考的代码吗?
      

  4.   

    void CGxSingleCamColorDlg::DrawVLine(BYTE* pBufferRGB,int64_t nImageHeight, int64_t nImageWidth,CPoint leftV,CPoint rightV,CPoint downV )
    {
    COLORREF col;
    int rightk;
    int rightb;
    int leftk;
    int leftb;
    rightk = rightV.y/rightV.x;
    rightb = 0;
    leftk = (leftV.y-downV.y)/(leftV.x-downV.x);
    leftb = 0;
    int **p = new int*[m_nImageWidth];
    for(int i=0; i<m_nImageWidth; ++i)
    p[i] = new int[m_nImageHeight];
      for(int i=0;i<m_nImageWidth;i++)
        {
            for(int j=0;j<m_nImageHeight;j++)
           {
            //[j][k]=(j+1)*(k+1);
       if(i == leftV.x)
       {
       SetPixel(NULL,leftV.x,/*(leftV.y-downV.y)/(leftV.x-downV.x)*/-(rightV.y/rightV.x)*leftV.x,RGB(0,255,0));
       leftV.x++;
       }
       if( i == rightV.x)
       {
       SetPixel(NULL,rightV.x,(rightV.y/rightV.x)*rightV.x,RGB(255,0,0));
       rightV.x--;
       }       }
     
     }}这代码可以执行,可是线没画出来,,能帮我修正修正吗??
      

  5.   

    画到虚拟dc上,再画v,得到HBITMAP,利用CAtlImage类存成png,jpg,tif,bmp随便
    或者自己搞俩方程,逐个改变像素值----一般图片是 rgb.rgb,rgb...这么存的,我见过rrrrrrrrrr......gggggggg......bbbbbbb这么存的
      

  6.   

    void XXXX::DrawV(HBITMAP hbmp,CPoint p1,CPoint p2, CPoint p3)
    {
    CClientDC dc(this);
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    // new line color
    HPEN hpen=CreatePen(PS_SOLID,1,RGB(255,255,255));
    HPEN oldp=(HPEN)memDC.SelectObject(hpen);
    // put the hbitmap in memDC
    HBITMAP old=(HBITMAP)memDC.SelectObject(hbmp);
    // draw V
    memDC.Moveto(p1);
    memDC.LineTo(p2);
    memDC.LineTo(p3);
    // release
    memDC.SelectObject(oldp);
    memDC.SelectObject(old);
    // rewdraw
    // Invalidate();
    }// caller
    DrawV(m_bitmap,CPoint(20,20),CPoint(100,100),CPoint(80,80));
    Invalidate();
      

  7.   

    更简单(但不保存在位图中);这时不能 redraw( Invalidate();
    void CPgmDlg::DrawV(HBITMAP hbmp,CPoint p1,CPoint p2, CPoint p3)
    {
    CClientDC dc(this);
    // CDC memDC;
    // memDC.CreateCompatibleDC(&dc);
    // new line color
    HPEN hpen=CreatePen(PS_SOLID,1,RGB(255,255,255));
    HPEN oldp=(HPEN)dc.SelectObject(hpen);
    // put the hbitmap in memDC
    // HBITMAP old=(HBITMAP)memDC.SelectObject(hbmp);
    // draw V
    dc.MoveTo(p1);
    dc.LineTo(p2);
    dc.LineTo(p3);
    // release
    dc.SelectObject(oldp);
    // memDC.SelectObject(old);
    // redraw
    // Invalidate();
    }
      

  8.   

    我已经弄好了,在CCD的SDK里写好这函数了,没有用到封装好的API。谢谢给的代码,学习了。结贴给分。