Simple and Effective Magnifier Using Very Easy Logic in C#

Introduction

While I working in GUI design I need to ensure each and every pixel of the application, so I need a magnifier. I used the default Windows magnifier but it will not meet my zoom level and this requires implementing this magnifier with very simple logic.

Concept behind the approach


Here the actual need is to zoom in a specific region. We get the screenshot of the image and zoom it using the BitMap value and display. For lens representation we used a Form and PictureBox in which we have used "i" to zoom in and "o" to zoom out and "Esc" to close the form.

C# Code behind the approach

PictureBox pictureBox1 = new PictureBox(); // Have a picture box

int zoom = 1; // Variable for zoom value

public Form1()

{

    pictureBox1.Dock = DockStyle.Fill; // Occupy the full area of the form

    pictureBox1.BorderStyle = BorderStyle.FixedSingle; // Have a single border of clear representation

    Controls.Add(pictureBox1); // Add the control to the form

    FormBorderStyle = FormBorderStyle.None; // Make the form borderless to make it as lens look

        

    Timer timer = new Timer(); // Have a timer for frequent update

    timer.Interval = 100; // Set the interval for the timer

    timer.Tick += timer_Tick; // Hool the event to perform desire action

    timer.Start(); //Start the timer

    printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); // Have a bitmap to store the image of the screen         

}
 

void timer_Tick(object sender, EventArgs e)

{

    var graphics = Graphics.FromImage(printscreen as Image); // Get the image of the captured screen

    graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size); // Get the copy of screen

    var position = Cursor.Position; // Get the position of cursor

    var lensbmp = new Bitmap(50, 50); // Have a bitmap for lens

    var i = 0; // Variable for row count

    var j = 0; // Variable for column count

    for (int row = position.X - 25; row < position.X + 25; row++) // Indicates row number

    {

        j = 0; // Set column value '0' for new column

        for (int column = position.Y - 25; column < position.Y + 25; column++) // Indicate column number

        {

            lensbmp.SetPixel(i, j, printscreen.GetPixel(row, column)); // Place current region pixel to lens bitmap

            j++; // Increase row count

        }

        i++; // Increase column count

    }

    this.pictureBox1.Image = new Bitmap(lensbmp, lensbmp.Width * zoom, lensbmp.Height * zoom); // Assign lens bitmap with zoom level to the picture box

    Size = pictureBox1.Image.Size; // Assign optimal value to the form

    Left = position.X + 20; // Place form nearer to cursor X value

    Top = position.Y + 20; // Place form nearer to cursor Y value

    TopMost = true; // Keep the form top level

}

 

// Override OnKeyDown for zoom in and zoom out actions

protected override void OnKeyDown(KeyEventArgs e)

{

    if (e.KeyValue == 73) // Set "i" as the key for Zoom In.

        zoom++; // Increase zoom by 1 item greater

    else if (e.KeyValue == 79) // Set "o" as the key for Zoom Out

        zoom--; // Decrease zoom by 1 item smaller

    else if (e.KeyValue == 27) // Set "Esc" to close the magnifier

    {

        Close(); // Close the form

        Dispose(); // Dispose the form

    }

    base.OnKeyDown(e);

}

 

Magnifier

Conclusion

Hence this simple logic gives you an efficient magnifier.