我想实现一个功能:
位图(256色)加载显示之后,用鼠标选取一幅位图的一部分,读到选中的这一块矩形区域的位图数据并把它写入一个文本文件中。我通过OnLButtonDown和OnLButtonUp这两个函数取得了鼠标起点和终点的坐标,但是剩下的具体怎么实现?
位图(256色)加载显示之后,用鼠标选取一幅位图的一部分,读到选中的这一块矩形区域的位图数据并把它写入一个文本文件中。我通过OnLButtonDown和OnLButtonUp这两个函数取得了鼠标起点和终点的坐标,但是剩下的具体怎么实现?
解决方案 »
- vc网络编程 出现wsasocket未定义
- 又是already defined in *.obj的问题
- 求助,这段代码用VB如何实现
- 求教:如何加快多个画面的切换速度
- 可用分又不涨了,散点分!
- win32api类型的程序中,我引进了一个.h和一个.cpp文件,却无法在WndProc中直接调用里面的函数,为什么?
- 有关关闭视图的的问题?
- 我在Dlg 上放置了了CListCtrl 控件,使用GetDlgItem 得到它的指针,却不能调用到如下方法
- 保存文件的小问题
- 在C++中模拟Pascal中的函数嵌套定义(共享给大家)
- 无法定位程序输入点 WakeAllConditionVariable 于动态链接库kernel32.dll上
- 关于切分窗口的问题
用GetDIBits可以取得区域的数据。
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
能不能利用这个思路呢?之前我取图像像素数据都是通过这样的办法:
pImgData=(unsigned char*)(pDoc->m_pDib+ sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * colorTableLng); //让指针pImgData指向位图数据
data=*pImgData; //取得该位置像素值赋给data
呵呵,可能我的表达有问题,或者你们理解错了。我一开始就说明了我要处理的只是八位的256色的位图,不涉及到RGB值。
OnPrepareDC(&pDC);
pDC.DPtoLP(&point);将设备坐标转化为逻辑坐标。就获得了以视图左上角为起点的坐标。
point.x和point.y可以看作该点在图片中的像素坐标得到像素坐标后,获得图片数据区首指针。定位到该坐标下的数据区。
注意,位图以左下角为起始点。所以Y坐标应该是Height-point.y;获得的该数据就是该像素的调色板序号。对应256色灰度图,就相当于灰度值。你通过2个for循环就可以得到所选矩形区域所有像素值。用FILE或者ofstream都可以写文件。
for(int i = 0; i < FilterWidth; i++)
for(int j = 0; j < FilterHeight; j++)
src += j * LineBytes(灰度图像的宽度)+ i
*src就是你要的灰度值。