简体   繁体   中英

how to extend draw area in Graphics.DrawImage c#

I have a Rectangle (rec) that contains the area in which a smaller image is contained within a larger image. I want to display this smaller image on a Picturebox. However, what I really am doing is using the smaller image as a picture detector for a larger image that is 333x324. So what I want to do is use the coordinates of the smaller image rectangle, and then draw to the Picturebox, starting from lefthand side of the rectangle, going outwards by 333 width and 324 height.

Currently my code works but it only displays the small image that was being used for detection purposes. I want it to display the smaller image + 300 width and + 300 height.

I fiddled with this code for hours and I must be doing something extremely basic wrong. If anyone can help me I would appreciate it so much!

My code for the class:

public static class Worker
{

    public static void doWork(object myForm)
    {
        //infinitely search for maps
        for (;;)
        {


            //match type signature for Threading
            var myForm1 = (Form1)myForm;

            //capture screen
            Bitmap currentBitmap = new Bitmap(CaptureScreen.capture());

            //detect map
            Detector detector = new Detector();
            Rectangle rec = detector.searchBitmap(currentBitmap, 0.1);

            //if it actually found something
            if(rec.Width != 0)
            {
                // Create the new bitmap and associated graphics object
                Bitmap bmp = new Bitmap(rec.X, rec.Y);
                Graphics g = Graphics.FromImage(bmp);

                // Draw the specified section of the source bitmap to the new one
                g.DrawImage(currentBitmap, 0,0, rec, GraphicsUnit.Pixel);

                // send to the picture box &refresh;
                myForm1.Invoke(new Action(() =>
                {
                    myForm1.getPicturebox().Image = bmp;
                    myForm1.getPicturebox().Refresh();
                    myForm1.Update();
                }));

                // Clean up
                g.Dispose();
                bmp.Dispose();

            }

            //kill
            currentBitmap.Dispose();

            //do 10 times per second
            System.Threading.Thread.Sleep(100); 

        }
    }
}

If I understand correctly, the rec variable contains a rectangle with correct X and Y which identifies a rectangle with Width=333 and Height=324 .

So inside the if statement, start by setting the desired size:

rec.Width = 333;
rec.Height = 324;

Then, note that the Bitmap constructor expects the width and height, so change

Bitmap bmp = new Bitmap(rec.X, rec.Y);

to

Bitmap bmp = new Bitmap(rec.Width, rec.Height);

and that's it - the rest of the code can stay the way it is now.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM