Увеличить определенную область экрана
Я работаю над созданием инструмента лупы с использованием 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);
}