想在mfc环境下实现以下操作,
已知图像中4个点的坐标,截取4个点所围成的图像并保存为输出图像。
哪位高手帮忙看一下,不胜感激!

解决方案 »

  1.   

    很简单,申请个四个点所围成的矩形大小的空间,然后从从原图中把四个点所围成的图像区域赋到申请的空间上,最后删除原图像数据,将新申请空间的数据赋到原空间中,并修改图像信息,包括长宽和SIZE.
      

  2.   

    图像是矩形的,所以你这四个点首先要保证能构成矩形..
    这其实就是StretchBlt()函数的使用而已,//功能: 截取4个点所围成的图像
    //参数: hBmp待截取的位图句柄; hDC设备句柄; (ptLeftTop, pt....)四个点
    //返回: 截取后的位图
    HBITMAP CTestDlgDlg::SectionBmp(
     HBITMAP hBmp, HDC hDC,
     POINT ptLeftTop, POINT ptLeftBottom, 
     POINT ptRightTop, POINT ptRightBottom)
    {
    int iWidth, iHeight; //截取后位图的尺寸
    iWidth = ptRightTop.x - ptLeftTop.x; //宽 = 右上点.X - 左上点.X
    iHeight = ptLeftBottom.y - ptLeftTop.y; // 长 = .....
    HBITMAP hSctBmp = CreateCompatibleBitmap(hDC, iWidth, iHeight);
    HDC hMemDCSrc = CreateCompatibleDC(hDC); //准备两内存设备,一个帖原图
    HDC hMemDCDest = CreateCompatibleDC(hDC);//一个贴裁截后的图
    //将位图选入设备
    SelectObject(hMemDCSrc, hBmp);
    SelectObject(hMemDCDest, hSctBmp); StretchBlt(
    hMemDCDest, 0, 0, iWidth, iHeight, 
    hMemDCSrc, ptLeftTop.x, ptLeftTop.y, iWidth, iHeight, SRCCOPY); //释放资源
    DeleteDC(hMemDCSrc);
    DeleteDC(hMemDCDest); return hSctBmp;
    }下面测试下这个函数//单击一个Button,截取并保存位图
    void CTestDlgDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    HBITMAP hBmp = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1));//加载原图
    //所要截取区域,注意四个点一定要形成一个矩形
    POINT ptLeftTop = {10, 10};
    POINT ptRightTop = {300, 10};
    POINT ptLeftBottom = {10, 200};
    POINT ptRightBottom = {300, 200};
    HBITMAP hSctBmp = SectionBmp(
    hBmp, this->GetDC()->m_hDC, 
    ptLeftTop, ptLeftBottom,
    ptRightTop, ptRightBottom); //得到截取后的位图句柄 SaveBmpToFile("SctBmp.bmp", hSctBmp);//保存BMP到文件,参考MSDN
    }关于保存位图到文件MSDN有例子,你可以看看,有问题我们再讨论...
      

  3.   

    不是矩形,也就意味着要分成很多个小矩形处理,这个可以利用windows的Region对象来实现,并且你要保存的是非矩形的区域,也就说周边的区域为透明色,那只能保存为PNG格式之类的了,BMP和JPG是不行的。
      

  4.   

    不管你的四个点怎么分布,最终你要保存的图像文件一定是一个矩形,只是你要对非图像目标区域做什么样的填充的问题
    至于你要对图像目标区域进行处理,你可按楼上所说的使用一个Region,如果是使用GDI的方法,那可以考虑直接基于Region使用Clip
    如果是用自己的算法,除了Region外也可以考虑使用联合一张mask图来处理目标区域
      

  5.   

    OPENCV 很简单可以实现楼主的功能