Считывание цвета пикселя с экрана. Выбрать наиболее оптимальный код из двух предложенных - C#
Формулировка задачи:
Возникла потребность считывать цвет пикселя, сейчас приведу 2 подхода к решению етой задачи.
При чем частота вызовов метода вариируеться(от 1 до 20) раз в секунду.
От вас требуеться обоснованный ответ на вопрос "какой из методов быстрее при многократном вызове?".
, спасибо
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern uint GetPixel(IntPtr hDC, int x, int y);IntPtr hDC = GetDC(IntPtr.Zero);
uint pixel = GetPixel(hDC, x, y);
ReleaseDC(IntPtr.Zero, hDC);byte r = (byte)(pixel & 0x000000FF);
byte g = (byte)((pixel & 0x0000FF00) >> 8);
byte b = (byte)((pixel & 0x00FF0000) >> 16);Ilya81
static Color GetPixel(Point position)
{
using (var bitmap = new Bitmap(1, 1))
{
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(position, new Point(0, 0), new Size(1, 1));
}
return bitmap.GetPixel(0, 0);
}
}Решение задачи: «Считывание цвета пикселя с экрана. Выбрать наиболее оптимальный код из двух предложенных»
textual
Листинг программы
using System;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern int ReleaseDC(IntPtr hwnd, IntPtr hDC);
[DllImport("gdi32.dll")]
public static extern uint GetPixel(IntPtr hDC, int x, int y);
static Color GetPixel(Point position)
{
using (var bitmap = new Bitmap(1, 1))
{
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(position, new Point(0, 0), new Size(1, 1));
}
return bitmap.GetPixel(0, 0);
}
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 10; i++)
GetPixel(new Point(i, i));
sw.Stop();
Console.WriteLine("{0}:{1}", sw.Elapsed.Seconds, sw.Elapsed.Milliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 10; i++)
{
IntPtr dc = GetDC(IntPtr.Zero);
GetPixel(dc, i, i);
ReleaseDC(IntPtr.Zero, dc);
}
sw.Stop();
Console.WriteLine("{0}:{1}", sw.Elapsed.Seconds, sw.Elapsed.Milliseconds);
Console.ReadKey(true);
}
}