我想实现一个功能:
位图(256色)加载显示之后,用鼠标选取一幅位图的一部分,读到选中的这一块矩形区域的位图数据并把它写入一个文本文件中。我通过OnLButtonDown和OnLButtonUp这两个函数取得了鼠标起点和终点的坐标,但是剩下的具体怎么实现?

解决方案 »

  1.   

    写文本文件?写二进制文件不是更好
    用GetDIBits可以取得区域的数据。
      

  2.   

    通过两个消息响应知道矩形的左上点和右下点,不过要注意两个点要分别减去位图的左上点坐标,最好用ClientToScreen来找到实际位图中的矩形位置
      

  3.   

    问类似问题的真多,可惜c++忘的差不多了,给你一段简单的代码吧,或许对你有些提示。至于鼠标选择的区域,如果图像没有变换过,直接使用(i1,j1)(i2,j2)
    for i=i1 to i2
       for j=j1 to j2
       next
    nextPrivate Sub ImageOperator(ByVal image_stream As Stream, _
                              ByVal new_image_stream As Stream)
            Dim i As Integer
            Dim j As Integer
            Dim c As Color
            Dim bit_map As Bitmap
            Dim new_bit_map As New Bitmap(new_image_stream)'        Dim _image1 As Image ' = Image.FromFile("c:\my document\my picture\my.jpg")
    '        _image1 = Image.FromStream(image_stream)
    '        bit_map = New Bitmap(_image1)        For i = 0 To 256 - 1
                For j = 0 To 256 - 1                ' 注意下面两行代码 
                    c = bit_map.GetPixel(i, j)
                  new_bit_map.SetPixel(i, j, c)                Application.DoEvents()
                Next
            Next
    End Sub
      

  4.   

    其实主要问题是我想拿到坐标point(x,y)的像素数据(0~255)。我这样子把指针指向坐标位置point好像又不行。pBuf=(char *)&m_ptOrigon。VC基础不太好。
      

  5.   

    鼠标的位置通过OnLButtonDown的参数就可以有啊,如果你想拿到点的颜色值的话,最方便的方法是用GetPixel,不过效率就差点了。
      

  6.   

    用GetDIBits应该还是可以的,不过要计算位置确实有点麻烦,这个API不支持区域操作。有一个折衷的方法,你先用BitBlt将你要的图贴到一个内存DC中去,再调用GetDIBits就行了。
      

  7.   


    能不能利用这个思路呢?之前我取图像像素数据都是通过这样的办法:
    pImgData=(unsigned char*)(pDoc->m_pDib+ sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * colorTableLng);  //让指针pImgData指向位图数据
    data=*pImgData;  //取得该位置像素值赋给data 
      

  8.   

    再补充一下,我只是要取256色的位图灰度值,不需要RGB值。
      

  9.   

    怎么又说到灰度值了?如果自己写代码,这需要一定的算法解决的,比如一个rqb值的亮度对应灰度值的哪一个并不是简单的,需要策略,确定了策略算法就简单了。
      

  10.   


    呵呵,可能我的表达有问题,或者你们理解错了。我一开始就说明了我要处理的只是八位的256色的位图,不涉及到RGB值。
      

  11.   

    OnLButtonDown里面CClientDC pDC(this);
    OnPrepareDC(&pDC);
    pDC.DPtoLP(&point);将设备坐标转化为逻辑坐标。就获得了以视图左上角为起点的坐标。
    point.x和point.y可以看作该点在图片中的像素坐标得到像素坐标后,获得图片数据区首指针。定位到该坐标下的数据区。
    注意,位图以左下角为起始点。所以Y坐标应该是Height-point.y;获得的该数据就是该像素的调色板序号。对应256色灰度图,就相当于灰度值。你通过2个for循环就可以得到所选矩形区域所有像素值。用FILE或者ofstream都可以写文件。
      

  12.   

    获取了位图数据的起始位置pImgData后,然后获取新的指向选择框的的数据指针(设为 *Src),注意位图是否倒置数据。之后就可以用
    for(int i = 0; i < FilterWidth; i++)
      for(int j = 0; j < FilterHeight; j++)
          src += j * LineBytes(灰度图像的宽度)+ i
        *src就是你要的灰度值。