一张bmp的图片,鼠标选取部分保留,其余部分全部变成白色,不知道应该怎么做,请各位指点指点。
我现在已经实现了选取,而且可以把选取部分保存为bmp的图片,但是却不知如何实现上述功能。
研究了一下bmp文件格式,觉得可以直接改变.bmp文件,可是不知道选取坐标和图片数据矩阵的对应关系是怎样的!

解决方案 »

  1.   

    你得去分析bmp文件数据组织格式
    去掉文件头和调色板部分,数据是根据图片像素的左下角到右上角的顺序组织的
    每个像素占用字节和位图格式有关
    把这个研究一下,找到矩形所对应像素改成白色就不难了
      

  2.   

    分析文件格式并不是好的方法,我觉得好的方法可以先在内存DC中做出背景图来,然后将选取的部分BitBlt过去。
      

  3.   

    只要知道bmp图像的数据的存储顺序是从左下到右上的就行了,然后你自己画图来分析一下就出来了,挺好理解的。
      

  4.   

    方法我知道,可始终没有将截取的图片粘贴到背景图片上。保存的是一张白色的图片!
    代码如下:                CDC *pBkDC=GetDC();  
    hMemDC = CreateCompatibleDC(pBkDC->m_hDC);   GetObject(hbitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap); 
    hBkBitmap = CreateCompatibleBitmap(hMemDC,Bitmap.bmWidth,Bitmap.bmHeight);
    HBITMAP hOldBkBitmap = (HBITMAP)::SelectObject(hMemDC,   hBkBitmap); 
    //背景填充为白色
    ::SetBkMode(hMemDC,OPAQUE);//背景模式为不透明
    ::SetBkColor(hMemDC,RGB(255,255,255));
    RECT rt = {0,0,rect.bottom,rect.right};
    HBRUSH hBrushBg = CreateSolidBrush(RGB(255,255,255));
    FillRect(hMemDC,&rt,hBrushBg);
    DeleteObject(hBrushBg);
    //将截取图片粘贴到背景图片上
    CDC *pDC=GetDC();
    hSourceDC = CreateCompatibleDC(pDC->m_hDC); 
    HBITMAP hOldInterceptBmp= (HBITMAP)::SelectObject(hSourceDC, hInterceptBmp);  ::SetBkMode(hSourceDC,TRANSPARENT);//背景模式为透明
    ::BitBlt(hMemDC,rect.left,rect.top,Bitmap.bmWidth,Bitmap.bmHeight,
    hSourceDC,0,0,SRCCOPY);//PATCOPY  hInterceptBmp = (HBITMAP)::SelectObject(hSourceDC, hOldInterceptBmp); 
    hBkBitmap = (HBITMAP)::SelectObject(hMemDC, hOldBkBitmap);

    DeleteDC(hMemDC); 

    ReleaseDC(pBkDC);
    ReleaseDC(pDC);