Считывание цвета пикселя с экрана. Выбрать наиболее оптимальный код из двух предложенных - 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);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.5 из 5
Похожие ответы