c#从桌面获取快照

时间:2013-11-28 02:49:12

标签: c# .net

我正在c#中创建应用程序以从桌面拍摄快照..所以我无法正确理解copyfromscreen方法它是Graphics.CopyFromScreen方法(Int32,Int32,Int32,Int32,大小)根据msdn文档。有5个参数,我们将它们命名为a1,a2,a3,a4,a5 a1,a2图像说明x,y。没关系,但a3,a4,称为目的地x和y,a5是大小..我无法理解我认为我只需要a1 a2和a5,因为有起始位置和大小然后所有要求都已完成绘制一个矩形。在我的应用程序中,我设置起始位置以形成位置,并且表单是完全透明的..所有我需要的是在表单内部进行桌面快照.i当我将a5参数(大小)更改为不同值时,使用msgbox检测图像大小一个恒定的大小出现在msgbox ..我不知道为什么它是1023 768和我的桌面大小相同.. important ::::我想在窗体可见桌面区域内拍摄快照所以我需要开始点设置窗体起点和尺寸a5形成尺寸,但它不起作用 我想要更多关于这个方法它无法理解msdn文件..这是我的c#代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.IO;


namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        private Bitmap screen=null;
        public Form1()
        {
            InitializeComponent();
           // this.FormBorderStyle = FormBorderStyle.None;
        }

        private void button1_Click(object sender, EventArgs e)
        {
          //  this.BackColor = Color.Red;
            this.TransparencyKey = Color.White;
        }
        public void snap()
        {
            pictureBox1.Image = null;
            Bitmap screen1 = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
         Screen.PrimaryScreen.Bounds.Height);

            using (Graphics g = Graphics.FromImage(screen1))
            {
               Size a = new Size(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
                Size reg = new Size(this.Width,this.Height);
                Size def = new Size(500, 800); 

                g.CopyFromScreen(this.Left, this.Top, int.Parse(textBox1.Text), 100, def);

            }
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

            pictureBox1.Image = screen1;

            screen1.Save("C:\\Users\\Madhawa\\Desktop\\java\\source\\Teboscreen_source_code\\"+random()+"screen.png", ImageFormat.Png);
            int sHeight = screen1.Height;
            int swidth = screen1.Width;
            MessageBox.Show("width:= " + swidth + "  height:= " + sHeight);

           // screen.Save("c:\\button.gif", System.Drawing.Imaging.ImageFormat.Gif);
        }

        private void button2_Click(object sender, EventArgs e)
        {

            this.TransparencyKey = Color.WhiteSmoke;
            snap();
        }
        public static String random()
        { 
            ///////create different name for save image//////
            Random rnd = new Random();
            int ran1 = rnd.Next(1, 10000);
            int ran2 = rnd.Next(10000, 20000);
            int ran3 = rnd.Next(20000, 50000);
            //////////////////////////////////////////////
           // string time=  string.Format("{0_HH_mm_ss tt}", DateTime.Now);
            DateTime dateTime = DateTime.UtcNow.Date;
            DateTime dateTime1 = DateTime.UtcNow.Date;
            string date= dateTime.ToString("dd_MM_yyyy");
            string date1 = dateTime.ToString("HH_mm_ss");

            //////////////////////////////////////////////

            string myString = ran1 + "" + ran2 + "" + ran3 + "t" + date1 + "" + date;
            //string m = "";
            return myString;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

假设我理解你的问题,关键是这一行:

Bitmap screen1 = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                            Screen.PrimaryScreen.Bounds.Height);

这会创建一个与主桌面大小相同的位图图像,我收集的是1023x768。

Graphics对象允许您绘制到该位图,但底层位图仍为1023x768。

如果您对仅使用500x800图像感兴趣,则应将其更改为:

Bitmap screen1 = new Bitmap(500,800);

至于关于Bitmap的绘图,这里是msdn文档Graphics.copyFromScreen的链接。

参数是

public void CopyFromScreen(
    int sourceX,
    int sourceY,
    int destinationX,
    int destinationY,
    Size blockRegionSize
)

您好像正在尝试截取表单下方的内容,如果我误解了您的代码,请更正我。

所以你想要:

sourceX = this.left (assuming you are are calling from the form)
sourceY = this.top (assuming you are calling from the form)
destinationX = 0
destinationY = 0
blockRegionSize = new Size(500, 800)

编辑:sourceXY说明从哪里获取屏幕截图,在这种情况下从表单的左上角开始。 destinationXY表示将屏幕截图粘贴到位图上的位置。由于我们希望位图(屏幕截图的最终结果)只是500x800图像,上面或左边没有空白边框,我们想从位图的左上角开始绘制...位置(0 ,0)。

我打算在拍摄截图的同时将表格设置为透明,过去我在将透明键设置为Color.White时遇到了麻烦,尽管像rgb(255,255,254)这样的颜色会正确透明


关于透明度,我发现了一些有用的东西,还有一些没有用。

有效的方法:

第一种方法,只需在截取屏幕截图之前隐藏整个表单,然后再显示它。有一个优点是您不需要单独更改表单上所有按钮和标签的颜色。

你可能需要Thread.sleep(100)或者在隐藏之后和截取屏幕之前手动调用Form1.Invalidate()或其他东西,让屏幕时间完全隐藏表单。

Form1.hide(); 
snap();
Form1.show();

第二种方法,改变表单的不透明度。与第一种方法类似。

Form1.Opacity = 0;
snap();
Form1.Opacity = 100;

在表单上使用transparencyKey要困难得多,对我来说就像这样。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        this.TransparencyKey = Color.Orange;
        this.FormBorderStyle = FormBorderStyle.None;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Hide();
        Form myForm = button1.FindForm();
        myForm.BackColor = Color.Orange;
        myForm.Hide();
        myForm.Show();
        myForm.Invalidate();

        Thread.Sleep(2000); //The form disappears for 2 seconds. 

        myForm.BackColor = Color.Black;
        myForm.Hide();
        myForm.Show();
        button1.Show();
        myForm.Invalidate();
    }
}

不幸的是,没有隐藏和重新显示表单,它似乎不会重绘背景,所以即使背景颜色设置为橙色,你仍然会看到黑色背景。

这可能是由于操作系统使像素透明,查看其下面的内容,但仍然看到该像素的旧颜色,并因此绘制了该颜色。但这只是猜测。