[Visual Studio, VB] I want to shorten the time it takes to get RGB colors for pixels (pixels) at the specified location
Creating Windows form applications in Visual Studio 2017 Community.
The pixel color at the mouse pointer position is set to the background color of PictureBox shutsuryoku
, and R(0-255), G(0-255), and B(0-255) are displayed in Label ontei
, onlyou
, joutai
, respectively.
I use PictureBox, but I don't handle images such as bitmaps.You can read colors freely at any point on the display.
Here is the source code:It's a program I'm just making, so don't worry about some pointless procedures.
Public Class Form 1
' ■ API function declaration
Declare Sub Sleep Lib "kernel32" (ByValdwMillisconds As Integer)
'Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Long
Declare Function GetTickCount Lib "kernel32" ( ) As Long
Declare Function GetPixel Lib "gdi32" Alias "GetPixel"_
(ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer) As UInt32
Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Integer) As Integer
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As_)
IntPtr, ByVal hdc As IntPtr) As UInt32
Declare Function GetDesktopWindow Lib "user32"() As Long
' ■ declaration of variable
Private i As Long
Private j As Long
Private As Long
Private tick As Long
Private window As Long
Private hdc As Long
Private Pixel Color As Color
Private Speed Update Time As Long
Private pointer position X As Long
Private pointer position YAs Long
Private Output Color As Color
US>'What to do when the form is loaded?
Private SubForm1_Load (sender As Object, eAs EventArgs) Handles MyBase.Load
'Get the Desktop Window Handle
window=GetDesktopWindow
'Get DC handle
hdc = GetDC (window)
tick = 0
Speed Update Time = GetTickCount
End Sub
Private Sub Timer 1_Tick (sender As Object, eAs EventArgs) Handles Timer 1.Tick
' ■ Count the tick count
tick=tick+1
' ■ Display update speed
If tick Mod 10 = 0 Then
If GetTickCount - Speed Update Time > 0 Then
koushinsokudo.Text=Int(1/(GetTickCount - Speed Update Time)/10/1000))
End If
Speed Update Time = GetTickCount
End If
' ■ Get pointer position
Pointer Location X = System.Windows.Forms.Cursor.Position.X
Pointer Location Y=System.Windows.Forms.Cursor.Position.Y
'View
pX.Text = pointer position X
pY.Text = pointer position Y
' ■ Get pointer position color
Forn=1 To 6
Get Call pixel color (pointer position X, pointer position Y)
Next
'RGB value converted to Color type
Output Color = Pixel Color
'Output
shutsuryoku.BackColor= Output Color
US>'View RGB values
ontei.Text=pixel color.R
onlyyou.Text=pixel color.G
joutai.Text = Pixel color.B
US>' Displayed in Progress Bar
US>'To disable the display of animation in which the bar gradually grows when the value increases
'Reduce from a larger value
onteibar.Maximum=256
onteibar.Value=256
onteibar.Value=pixel color.R
onteibar.Maximum=255
onryoubar.Maximum=256
onryoubar.Value=256
onryoubar.Value=pixel color .G
onlyoubar.Maximum=255
joutaibar.Maximum=256
joutaibar.Value = 256
joutaibar.Value = Pixel color .B
joutaibar.Maximum=255
End Sub
Obtain subpixel color (ByVal x As Long, ByValy As Long)
Dim Color As Long
'Get Pixel Colors
Color=GetPixel(hdc,x,y)
US>'Convert Long to Color
Pixel Color = ColorTranslator.FromOle (Color)
End Sub
When the Find Location button is pressed,
Private Sub Button 1_Click (sender As Object, eAs EventArgs) Handles Button 1.Click
End Sub
US>'When closing the form
Private SubForm1_FormClosing(ByVal sender As Object,
ByVale As System.Windows.Forms.FormClosingEventArgs)Handles Me.FormClosing
US>'Release
ReleaseDC (window, hdc)
End Sub
End Class
There are no compilation or runtime errors, but it takes a lot of time to get the color of the pixels.
The procedure Timer1_Tick
runs only about nine times per second.
(Label koushinsokudo
shows how many times Timer1_Tick
has been run per second.)
Forn=1 To 6
Get Call pixel color (pointer position X, pointer position Y)
Next
As for the part of , it doesn't make sense to repeat the same process six times with this program, but as I mentioned earlier, this program is still in the process and I will try to do six meaningful "acquire pixel colors" when it is completed.
Therefore, we will have to run at least six "Find Pixel Colors" within Timer1_Tick
, so we will write about these programs.
By the way, if you rewrite Forn=1To6
to Forn=1To1
, it will be about 60 times per second.Therefore, it is unlikely that the processing other than color acquisition is taking an unusual amount of time.
The specifications of the computer are as follows.
OS Windows 10 Home
CPU 2.50 GHz (Core i5-3210M)
RAM 8 [GB]
The system type is 64-bit operating system, x64-based processors.
When you run this program, use the
Other applications are not running at the same time.
Also, if you check the CPU utilization in Task Manager, it is less than 10 percent, so it is unlikely that the background process is slowing down this program.
Now I have a question, how do I reduce the time it takes to get a pixel color?Please let me know if there is a way to do so.
Ideally, Timer1_Tick
should run more than 40 times per second (240 or more color acquisition), but if that's not possible, it can be 15 or 20 times per second.
It is not directly related, but GetPixel
is very slow, which is causing MFC Ribbon display problems reports.The GetPixel
speed may improve in the future.
© 2024 OneMinuteCode. All rights reserved.