在vb中怎么获取某个象素点的象素值呢?

lwizard 2004-07-22 08:44:23
谢谢
还有pixel下
读出来的图象width和height比实际的多4啊
为什么呢?
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqm2099 2004-07-23
  • 打赏
  • 举报
回复
UP
I_168_888 2004-07-23
  • 打赏
  • 举报
回复
Platform SDK: Windows GDI
GetPixel
The GetPixel function retrieves the red, green, blue (RGB) color value of the pixel at the specified coordinates.

COLORREF GetPixel(
HDC hdc, // handle to DC
int nXPos, // x-coordinate of pixel
int nYPos // y-coordinate of pixel
);
Parameters
hdc
[in] Handle to the device context.
nXPos
[in] Specifies the logical x-coordinate of the pixel to be examined.
nYPos
[in] Specifies the logical y-coordinate of the pixel to be examined.
Return Values
The return value is the RGB value of the pixel. If the pixel is outside of the current clipping region, the return value is CLR_INVALID.

Remarks
The pixel must be within the boundaries of the current clipping region.

Not all devices support GetPixel. An application should call GetDeviceCaps to determine whether a specified device supports this function.

Requirements
Windows NT/2000 or later: Requires Windows NT 3.1 or later.
Windows 95/98/Me: Requires Windows 95 or later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Use Gdi32.lib.

ryuginka 2004-07-23
  • 打赏
  • 举报
回复
up
starsoulxp 2004-07-23
  • 打赏
  • 举报
回复
Visual Basic 对于定义色彩有二种方法:

1、使用定义的常数:

如色彩属性的设定为红色,可以常数 vbRed 表示

2、直接使用色彩设定:

以十六进位数来指定色彩,方式为: &HBBGGRR&

BB是指定蓝色的部分,GG是指绿色,RR则为指定红色。

每个部分都是两位从 00 到 FF 的十六进位数。中间值为 80。

因此,以下的数值将指定灰色,它属于三种色彩的中间部分:&H808080&

上述二种色彩表示方式对应如下:

色彩常数 值 中文描述 英文描述 色块样板

vbRed &H0000FF& 红色 Red

vbGreen &H00FF00& 绿色 Green

vbBlue &HFF0000& 蓝色 Blue

vbBlack &H000000& 黑色 Black  

vbYellow &H00FFFF& 黄色 (红+绿) Yellow

vbMagenta &HFF00FF& 洋红色 (红+蓝) Magenta

Cyan &HFFFF00& 青绿色 (绿+蓝) Cyan

vbWhite &HFFFFFF& 白色 White

上述第 2 种方法,可以衍生出『若知道一值,则如何反算其红、绿、蓝颜色值各为何?』的问题。其计算方法则是反其道而行,计算顺序为首先计算蓝色值、其次为绿色值、最后为红色值。写成模块如下:

Private Sub ReturnRGB(ByVal lngColor As Long, intRed As Integer, intGreen As Integer, intBlue As Integer)

intRed = lngColor Mod 256

intGreen = (lngColor \ 256) Mod 256

intBlue = lngColor \ 256 \ 256

End Sub

BlueBeer 2004-07-22
  • 打赏
  • 举报
回复
//怎么获取某个象素点的象素值呢?

Point 方法


按照长整数,返回在 Form 或 PictureBox 上所指定磅的红-绿-蓝 (RGB) 颜色。不支持命名参数。

语法

object.Point(x, y)

Point 方法的语法包含下列部分:

部分 描述
object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,带有焦点的 Form 象缺省为 object.
x, y 必需的。均为单精度值,指示 Form 或 PictureBox 的 ScaleMode 属性中该点的水平(x-轴)和垂直(y-轴)坐标。必须用括号包括这些值。


//读出来的图象width和height比实际的多4啊
//为什么呢?

picturebox的width和height是控件本身的宽和高,而不是图像的宽和高
如果你没有使用自定义坐标,在AutoRedraw设为True的前提下,可以用ScaleWidth和ScaleHeight取得图像的宽和高
熊孩子开学喽 2004-07-22
  • 打赏
  • 举报
回复
代码如下:
Dim Color as long
Dim Red as long
Dim Green as Long
Dim Blue as long
Color =Picture1.Point(X, Y) 'X,Y坐标任意,只要在PICTUREBOX范围内
Red = Color and &HFF&
Greed = (Color\256) and &HFF&
Blue =Color\65536

顺便改成楼上的样子:
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Color as long
Color =Picture1.Point(X, Y) '得到鼠标在picture控件上的X,Y坐标处颜色
picture1.tooltips="RED: " & (Color and &HFF) & ",Green:" & ((Color\256) and &HFF) & ",Blue:" & (Color\65536)
End Sub
使用了整除法,速度稍快一点点。
northwolves 2004-07-22
  • 打赏
  • 举报
回复
不知你是不是这个意思:
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim color As Long
color = Picture1.Point(X, Y)
Picture1.ToolTipText = "color=" & color & ": red = " & color Mod 256 & ", green = " & ((color And &HFF00) / 256) Mod 256 & ", blue = " & (color And &HFF0000) / 65536
End Sub
熊孩子开学喽 2004-07-22
  • 打赏
  • 举报
回复
需要把PICTUREBOX的边框去掉
picture1.apearnce=0 '设为平板样式
picture1.borderstyle=0 '设为无边框样式
picture1.sclaemode=3 '单位设为像素
xuboying 2004-07-22
  • 打赏
  • 举报
回复
你是不是看了picturebox的width属性?把它的边框也算了进去
把border去掉
或者算scalewidth看看行不行
'源代码 Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long 'GetDC()功能是获取指定窗体的设备场景的句柄(hDC),用参数0则可以获取整个屏幕的场景句柄 Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long 'GetPixel用于取得场景(这里是整个屏幕)的颜色 Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long 'SetPixel用于设置场景(这里是整个屏幕)的颜色 Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long '释放由GetDC()获取的设备场景句柄,否则可能造成系统锁死 Private Declare Function InvalidateRect& Lib "user32" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) '清理窗口雪花 Private Type POINTAPI '定义坐标结构 x As Long y As Long End Type Private Type RECT '定义“区域”数据结构,但实际上并没有用到,因为仅需在函数InvalidateRect传递一个空的RECT参数 left As Long top As Long right As Long bottom As Long End Type Dim rect1 As RECT Private Const ScrnWidth = 1024 '屏幕宽度(单位:像素) Private Const ScrnHight = 768 '屏幕高度(单位:像素) Private Const SnowCol = &HFEFFFE '雪花颜色 Private Const SnowColDown = &HFFFFFF '积雪颜色 Private Const SnowColDuck = &HFFDDDD '深色积雪颜色 Private Const SnowNum = 500 '同一时间飘动的雪花数量 Dim hDC1 As Long '存储桌面窗口设备句柄 Dim pData(SnowNum) As POINTAPI '存储每个雪花的位置信息 Dim pColor(SnowNum) As Long '存储画出雪花前屏幕原来的颜色 Dim Vx As Integer '雪花总体水平飘行速度 Dim Vy As Integer '雪花总体垂直下落速度 Dim PVx As Integer '单个雪花实际水平飘行速度 Dim PVy As Integer '单个雪花实际垂直飘行速度 '初始化雪花位置 Private Sub InitP(i As Integer) pData(i).x = Rnd() * ScrnWidth pData(i).y = Rnd() * 2 pColor(i) = GetPixel(hDC1, pData(i).x, pData(i).y) '取得屏幕原来的颜色 End Sub '取得某一与周围的对比度,确定是否在此位置堆积雪花 Private Function GetContrast(i As Integer) As Long Dim ColorCmp As Long '存储用作对比的的颜色 Dim tempR As Long '存储CorlorCmp的红色部分,下同 Dim tempG As Long Dim tempB As Long Dim Slope As Integer '存储雪花飘落方向:Vx/Vy '计算雪花飘落方向 If PVy <> 0 Then Slope = PVx / PVy Else Slope = 2 End If '根据雪花飘落方向决定取哪一作对比, '若PVx/PVy在-1到1之间,即Slope=0,就取正下面的象素 '若PVx/PVy>1,取右下方的,PVx/PVy<-1则取左下方 If Slope = 0 Then ColorCmp = GetPixel(hDC1, pData(i).x, pData(i).y + 1) Else If Slope > 1 Then ColorCmp = GetPixel(hDC1, pData(i).x + 1, pData(i).y + 1) Else ColorCmp = GetPixel(hDC1, pData(i).x - 1, pData(i).y + 1) End If End If '确定当前位置没有与另一个雪花重叠,否则返回0,用于防止由于不同雪花重叠造成雪花乱堆 If ColorCmp = SnowCol Then GetContrast = 0 Exit Function End If '分别获取ColorCmp与对比的蓝、绿、红部分的差 tempB = Abs((ColorCmp And &HFF0000) - (pColor(i) And &HFF0000)) / &H10000 tempG = Abs((ColorCmp And &HFF00&) - (pColor(i) And &HFF00&)) / &H100& tempR = Abs((ColorCmp And &HFF&) - (pColor(i) And &HFF&)) '返回对比度 GetContrast = (tempR + tempG + tempB) / 3 End Function '画出一帧,即重画所有雪花位置一次 Private Sub DrawP() Dim i As Integer For i = 0 To SnowNum '防止雪花重叠造成干扰 If pColor(i) <> SnowCol Then '还原上一个位置的颜色 SetPixel hDC1, pData(i).x, pData(i).y, pColor(i) End If '设置新的位置,i Mod 3用于将雪花分为三类采用不同速度,以便形成层次感 PVx = Rnd() * 2 - 1 + Vx * (i Mod 3) PVy = Vy * (i Mod 3 + 1) pData(i).x = pData(i).x + PVx pData(i).y = pData(i).y + PVy '取得新位置原始颜色,用于下一步雪花飘过时恢复此处颜色 pColor(i) = GetPixel(hDC1, pData(i).x, pData(i).y) '如果获取颜色失败,表明雪花已飘出屏幕,重新初始化 If pColor(i) = -1 Then InitP i Else '否则若雪花没有重叠 If pColor(i) <> SnowCol Then '若对比度较小(即不能堆积),就画出雪花 'Rnd()>0.3用于防止某些连续而明显的边界截获所有雪花 If Rnd() > 0.3 Or GetContrast(i) < 50 Then SetPixel hDC1, pData(i).x, pData(i).y, SnowCol '否则表明找到明显的边界,画出堆积的雪,并初始化以便画新的雪花 Else SetPixel hDC1, pData(i).x, pData(i).y - 1, SnowColDuck SetPixel hDC1, pData(i).x - 1, pData(i).y, SnowColDuck SetPixel hDC1, pData(i).x + 1, pData(i).y, SnowColDown InitP i End If End If End If Next End Sub Private Sub Form_Load() Dim j As Integer Me.Caption = "桌面飘雪" '设置窗口标题 '设置计时器,Timer1用于画单帧,Timer2用于风向变化 Timer1.Enabled = True Timer1.Interval = 10 Timer2.Enabled = True Timer2.Interval = 2000 Randomize '初始化随机数种子 hDC1 = GetDC(0) '获取桌面窗口设备场景句柄 '初始化整个屏幕 For j = 0 To SnowNum pData(j).x = Rnd() * ScrnWidth pData(j).y = Rnd() * ScrnHight pColor(j) = GetPixel(hDC1, pData(j).x, pData(j).y) Next End Sub Private Sub Form_Unload(Cancel As Integer) ReleaseDC 0, hDC1 '释放桌面窗口设备句柄 InvalidateRect 0, rect1, 0 '清除所有雪花,恢复桌面 End Sub Private Sub Timer1_Timer() DrawP '画出一帧 End Sub Private Sub Timer2_Timer() '改变风向 Vx = Rnd() * 4 - 2 Vy = Rnd() + 2 End Sub '完,最后,需要两个Timer:Timer1、Timer2。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧