Увеличить определенную область экрана

Я работаю над созданием инструмента лупы с использованием C#. Так же, как этот: http://colorsnapper.com/ Я искал во всем Google способ увеличения масштаба заранее определенной области экрана, достаточный для просмотра каждого отдельного пикселя.

Чтобы быть более точным, я хочу, чтобы моя мышь стала увеличительным стеклом на экране, которое увеличивает каждый пиксель, над которым мышь наводит курсор. Мне нужно выяснить, как увеличить эту предопределенную область.

Кто-нибудь знает, как я могу это сделать, или какие API доступны.

ОБНОВЛЕНИЕ Я нашел API увеличения, предоставленный Microsoft: http://msdn.microsoft.com/en-us/library/windows/desktop/ms692402(v=vs.85).aspx Однако этот API-интерфейс находится в C++. Как я понял, C++ - это то, на чем написана ОС Windows, и для использования этого API мне понадобится какая-то оболочка C#. Это не вопрос, я просто думал, что добавлю в этот пост других пользователей.

1 ответ

Решение

Вы можете сделать снимок экрана в виде растрового изображения в памяти:

/// <summary>
/// Saves a picture of the screen to a bitmap image.
/// </summary>
/// <returns>The saved bitmap.</returns>
private Bitmap CaptureScreenShot()
{
    // get the bounding area of the screen containing (0,0)
    // remember in a multidisplay environment you don't know which display holds this point
    Rectangle bounds = Screen.GetBounds(Point.Empty);

    // create the bitmap to copy the screen shot to
    Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);

    // now copy the screen image to the graphics device from the bitmap
    using (Graphics gr = Graphics.FromImage(bitmap))
    {
           gr.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
    }

    return bitmap;
}

А затем возьмите часть изображения, возможно, прямоугольник 50 на 50 пикселей с центром в позиции мыши:

portionOf = bitmap.Clone(new Rectangle(pointer.X - 25, pointer.Y - 25, 50, 50), PixelFormat.Format32bppRgb);

И отобразите его в прямоугольнике размером 100 на 100 пикселей с центром в позиции мыши. Это даст вам 2-кратный уровень масштабирования. Чем больше соотношение (отображаемый размер)/(захваченный размер), тем больше вы увеличиваете. Что-то вроде:

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);

void OnPaint()
{
    IntPtr desktopDC = GetDC(IntPtr.Zero); // Get the full screen DC

    Graphics g = Graphics.FromHdc(desktopDC); // Get the full screen GFX device

    g.DrawImage(portionOf, pointer.X - 50, pointer.Y - 50, 100, 100); // Render the image

    // Clean up
    g.Dispose();
    ReleaseDC(IntPtr.Zero, desktopDC);
}
Другие вопросы по тегам