Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 261
  • Last Modified:

Getting a pixel's colour

How can I get a pixel's colour in a picture? I have tried to use: picture1.point(x,y), but it seems only to work when my form has the focus.
Is there a way to store the image in a variable and then call a point-like function to get the colour, e.g. using an API-Call?
0
Beginner2104
Asked:
Beginner2104
  • 6
  • 5
  • 2
  • +1
1 Solution
 
RuchiCommented:
Try this one...

Private Sub Form_Load()
Picture1.MousePointer = vbCrosshair
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Caption = Hex$(Picture1.Point(X, Y))
End Sub
0
 
Beginner2104Author Commented:
That works... but I can not let the user do it. It must be the program it self and when I try to do that it does not really work using the PictureBox.
0
 
RuchiCommented:
Can you explain me more about your problem?
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Erick37Commented:
The problem is that if the form that contains the PictureBox is minimized or covered by another window, the Point method returns -1.  This is also true for the GetPixel() API.
0
 
Beginner2104Author Commented:
Adjusted points to 70
0
 
Beginner2104Author Commented:
More about my problem:
1. I capture the screen and places the image in a PictureBox or a variable (If posible)
2. I want to identify certain pixels, see if they are black or white.
It has to be a fast method too.
0
 
nutwissCommented:
Erick:

Is this also true for an off-screen DC? (if not, surely this would be a solution?)
0
 
nutwissCommented:
nope... :)


Use a Picturebox with

autoredraw = true
visible = false

to hold the image - point(x,y) should now work
0
 
nutwissCommented:
As far as speed goes, try this:


Results:

Point:    5.0 seconds
GetPixel: 1.8 seconds


'#####################################
Option Explicit

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Sub Command1_Click()
Dim t As Double
Dim c As Long
Dim x As Long
t = Timer
For x = 1 To 100000
    c = Picture1.Point(10, 10)
Next
MsgBox Timer - t
End Sub

Private Sub Command2_Click()
Dim t As Double
Dim c As Long
Dim mydc As Long
Dim x As Long
mydc = Picture1.hdc
t = Timer
For x = 1 To 100000
    c = GetPixel(mydc, 10, 10)
Next
MsgBox Timer - t
End Sub
'##################################
0
 
Beginner2104Author Commented:
Point works using autoredraw=true,visible=false but I just get -1 from Getpixel(). Is there a way to get it working?
0
 
nutwissCommented:
in the code above, have you checked the value of 'c' in the command2_click sub?

I get the same as the point() result ((=/=-1) ....

I'm using NT4 SP3, but this shouldn't make a difference (I don't think - I haven't got my API reference with me today)
0
 
Beginner2104Author Commented:
I have checked the values... e.g. when I get 0 (black) from Point, I get 14... from GetPixel. Picture1.autoredraw=true Picture1.visible=false
0
 
Erick37Commented:
Make sure that you are referencing the same point.  GetPixel() uses pixel coordinates, Point uses the scalemode of the PictureBox.  Set the Scalemode of the picturebox to 3, pixels, and try again.
0
 
Beginner2104Author Commented:
Thank you both nutwiss and Erick37!! I forgot the last one about scalemode. Now it all works fine!! I'll make a question with some points for your last comment Erick37... what about making it posible to share the points among several answers?
0
 
nutwissCommented:
Beginner: If you're doing anything graphical, it should be a matter of course that you set scalemode to 3 - it makes life so much easier...
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 6
  • 5
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now