有谁知道如何使用 C# 截取屏幕截图并将其限制为拍摄应用程序的特定容器/部分的图片。我不想要应用程序的整个屏幕或整个窗口。
我的面板简称为:panel1 用户将单击“按钮”并截取 panel1 的屏幕截图并附加到电子邮件中。
我想只截取该部分的屏幕截图,然后在本地保存到 C:\ 驱动器和/或附加或嵌入到 Outlook 电子邮件中。
我在互联网上阅读了其他各种内容,但其中大多数都必须处理创建复杂的更改,以截取我不想要的 Web 浏览器控件的屏幕截图。
有谁知道如何使用 C# 截取屏幕截图并将其限制为拍摄应用程序的特定容器/部分的图片。我不想要应用程序的整个屏幕或整个窗口。
我的面板简称为:panel1 用户将单击“按钮”并截取 panel1 的屏幕截图并附加到电子邮件中。
我想只截取该部分的屏幕截图,然后在本地保存到 C:\ 驱动器和/或附加或嵌入到 Outlook 电子邮件中。
我在互联网上阅读了其他各种内容,但其中大多数都必须处理创建复杂的更改,以截取我不想要的 Web 浏览器控件的屏幕截图。
如果只想Panel's
截图,可以使用内置的DrawToBitmap方法。
Bitmap bmp = new Bitmap(myPanel.Width, myPanel.Height);
myPanel.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
bmp.Save(@"C:\MyPanelImage.bmp");
请注意,某些控件可能不适用于此功能,例如WebBrowser
和RichTextBox
控件,但它应该适用于大多数其他控件(文本框、标签等)。
我使用类似的东西来做到这一点
public static void TakeCroppedScreenShot(
string fileName, int x, int y, int width, int height, ImageFormat format)
{
Rectangle r = new Rectangle(x, y, width, height);
Bitmap bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(r.Left, r.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
bmp.Save(fileName, format);
}
我希望这有帮助
对 Asif 答案的改进:
public static Bitmap takeComponentScreenShot(Control control)
{
// find absolute position of the control in the screen.
Rectangle rect=control.RectangleToScreen(control.Bounds);
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
return bmp;
}
public static Bitmap takeComponentScreenShot(Control control)
{
// find absolute position of the control in the screen.
Control ctrl = control;
Rectangle rect = new Rectangle(Point.Empty, ctrl.Size);
do
{
rect.Offset(ctrl.Location);
ctrl = ctrl.Parent;
}
while (ctrl != null);
Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp);
g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
return bmp;
}
此方法将立即截屏。例如,如果您在调用此函数之前更改面板中按钮的可见性,则位图将包含该按钮。如果不需要,请使用keyboardP 的答案。
我发现这可以将控件保存为位图:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
SaveAsBitmap(panel1,"C:\\path\\to\\your\\outputfile.bmp");
}
public void SaveAsBitmap(Control control, string fileName)
{
//get the instance of the graphics from the control
Graphics g = control.CreateGraphics();
//new bitmap object to save the image
Bitmap bmp = new Bitmap(control.Width, control.Height);
//Drawing control to the bitmap
control.DrawToBitmap(bmp, new Rectangle(0, 0, control.Width, control.Height));
bmp.Save(fileName);
bmp.Dispose();
}
}
我在这里找到了一些关于 Outlook 的信息,但我无法对其进行测试,因为我的 PC 上没有安装 Outlook。
修改KeyboardP 的答案。修改为静态方法,因此可以用作助手。
public static Bitmap ScreenShotaControl(Control aControl)
{
try
{
Bitmap bmp = new Bitmap(aControl.Width, aControl.Height);
aControl.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
return bmp;
}
catch (Exception)
{
throw;
}
}
示例用法如下:
Bitmap bmp = ScreenShotaControl(aControl);
Clipboard.SetImage(bmp); //to copy to clipboard
Bitmap bmp = ScreenShotaControl(aControl);
bmp.Save(@"C:\MyPanelImage.bmp"); //save to specified path
Bitmap bmp = ScreenShotaControl(aControl);
MemoryStream ms= new MemoryStream();
bmp.Save(ms, ImageFormat.Jpeg);
ContentType ct= new ContentType();
ct.MediaType = MediaTypeNames.Image.Jpeg;
MailMessage mail = new MailMessage();
mail.Attachments.Add(new Attachment(ms, ct)); //attach to email