daniel llee
daniel llee

Reputation: 67

Why when cropping image i'm getting black image of the cropped image?

In form1 constructor

public Form1()
        {
            InitializeComponent();

            BackColor = Color.LightGreen;
            TransparencyKey = Color.LightGreen;
            this.TopMost = true;
            this.Location = new Point(0, 0);
            timer1.Enabled = true;
        }

Then:

private void Cap()
        {
            countImages++;            
            ScreenCapture sc = new ScreenCapture();            
            Image img = sc.CaptureScreen();
            Bitmap bmp = new Bitmap(img);
            Bitmap source = new Bitmap(this.Width, this.Height);
            Rectangle section = new Rectangle(new Point(source.Width, source.Height), source.Size);
            Bitmap CroppedImage = CropImage(source, section);
            CroppedImage.Save("c:\\temp\\screens\\" + countImages + ".gif", ImageFormat.Gif);
            source.Dispose();  
        }

And

public Bitmap CropImage(Bitmap source, Rectangle section)
        {
            // An empty bitmap which will hold the cropped image
            Bitmap bmp = new Bitmap(section.Width, section.Height);

            Graphics g = Graphics.FromImage(bmp);

            // Draw the given area (section) of the source image
            // at location 0,0 on the empty bitmap (bmp)
            g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel);

            return bmp;
        }

The Bitmaps i save to the hard disk:

CroppedImage.Save("c:\\temp\\screens\\" + countImages + ".gif", ImageFormat.Gif);

They are all black. I want to crop this part from the image and save it to the hard disk.

Example of screenshot and what i want to crop from it: I marked with a red circle the transparent form1 and this is what i want to crop the part of the form1 and save this as cropped image the form1 part:

Form1 to crop

I tried this first:

private void CaptureDesktop()
        {
            countImages++;
            ScreenCapture sc = new ScreenCapture();                    
            Image img = sc.CaptureScreen();
            Bitmap bmp = new Bitmap(img);            
            Bitmap source = new Bitmap(this.Width, this.Height);
            Rectangle section = new Rectangle(new Point(source.Width, source.Height), source.Size);
            Bitmap CroppedImage = CropImage(bmp, section);
            CroppedImage.Save("c:\\temp\\desktopscreens\\" + countImages + ".gif", ImageFormat.Gif);
        }

But i'm getting this cropped image as result: Strange picture in picture ?

Pinp

Then i tried this code:

using (Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                        Screen.PrimaryScreen.Bounds.Height))
            {
                using (Graphics g = Graphics.FromImage(bmpScreenCapture))
                {

                    g.CopyFromScreen(this.Location.X,
                                   this.Location.Y,
                                   0, 0,
                                   this.Size,
                                   CopyPixelOperation.SourceCopy);


                }

                Rectangle section = new Rectangle(new Point(this.Location.X, this.Location.Y), new Size(this.Width, this.Height));
                Bitmap CroppedImage = CropImage(bmpScreenCapture, section);
                CroppedImage.Save("c:\\temp\\desktopscreens\\1.bmp", ImageFormat.Bmp);


            }

But the result is:

pinp001

Not what i wanted. I want only to crop the form1 part from the whole image.

Upvotes: 0

Views: 821

Answers (2)

SQLAndOtherStuffGuy
SQLAndOtherStuffGuy

Reputation: 214

ScreenShot

Try this (some code from Capture the screen shot using .NET)

 private void Cap()
    {
        using (Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                        Screen.PrimaryScreen.Bounds.Height))
        {
            using (Graphics g = Graphics.FromImage(bmpScreenCapture))
            {

                g.CopyFromScreen(this.Location.X,
                               this.Location.Y,
                               0, 0,
                               this.Size,
                               CopyPixelOperation.SourceCopy);


            }

            Rectangle section = new Rectangle(new Point(this.Location.X, this.Location.Y), new Size(this.Width, this.Height));
            Bitmap CroppedImage = CropImage(bmpScreenCapture, section);
            CroppedImage.Save("c:\\temp\\screens\1.bmp", ImageFormat.Bmp);


        }




    }

    public Bitmap CropImage(Bitmap source, Rectangle section)
    {
        // An empty bitmap which will hold the cropped image
        Bitmap bmp = new Bitmap(section.Width, section.Height);

        Graphics g = Graphics.FromImage(bmp);

        // Draw the given area (section) of the source image
        // at location 0,0 on the empty bitmap (bmp)
        g.DrawImage(source, 0, 0, section, GraphicsUnit.Pixel);

        return bmp;
    }

Upvotes: 1

Mike Nakis
Mike Nakis

Reputation: 61969

You do Bitmap source = new Bitmap(this.Width, this.Height); this creates a black image.

Then you proceed to crop it. That's still a black image.

Then you proceed to save it. That's still a black image.

Perhaps you meant to crop Bitmap bmp or Image img, not Bitmap source. I don't know what Bitmap source is meant to be.

Upvotes: 2

Related Questions