下面是截屏事件的处理:不知道为什么截到图片总是在打开FORM2之前的桌面。 // 创建显示器的dc
Graphics g = Graphics.FromHdc(CreateDC("DISPLAY", null, null, IntPtr.Zero)); // 由一个指定设备的句柄创建一个新的graphics对象
Bitmap image = new Bitmap(this.splitContainer1.Panel1.Width, this.splitContainer1.Panel1.Height, g);
Graphics graphics2 = Graphics.FromImage(image);
IntPtr hdc = g.GetHdc();
IntPtr hdcDest = graphics2.GetHdc(); BitBlt(hdcDest, 0, 0, this.splitContainer1.Panel1.Width, this.splitContainer1.Panel1.Height, hdc, 0, 0, 0xcc0020); // 释放屏幕句柄
g.ReleaseHdc(hdc);
// 释放位图句柄
graphics2.ReleaseHdc(hdcDest);
image.Save(strFileName, ImageFormat.Jpeg);
image.Dispose();this 是一个Form2窗体。在Form1的Load事件里打开Form2窗体。
private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2(this);
f2.TopMost = true;
f2.Show();
}
Graphics g = Graphics.FromHdc(CreateDC("DISPLAY", null, null, IntPtr.Zero)); // 由一个指定设备的句柄创建一个新的graphics对象
Bitmap image = new Bitmap(this.splitContainer1.Panel1.Width, this.splitContainer1.Panel1.Height, g);
Graphics graphics2 = Graphics.FromImage(image);
IntPtr hdc = g.GetHdc();
IntPtr hdcDest = graphics2.GetHdc(); BitBlt(hdcDest, 0, 0, this.splitContainer1.Panel1.Width, this.splitContainer1.Panel1.Height, hdc, 0, 0, 0xcc0020); // 释放屏幕句柄
g.ReleaseHdc(hdc);
// 释放位图句柄
graphics2.ReleaseHdc(hdcDest);
image.Save(strFileName, ImageFormat.Jpeg);
image.Dispose();this 是一个Form2窗体。在Form1的Load事件里打开Form2窗体。
private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2(this);
f2.TopMost = true;
f2.Show();
}
Bitmap bitmap = new Bitmap(
Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);通过图片创建 Graphics
using (Graphics g = Graphics.FromImage(image))
{
截屏
g.CopyFromScreen(0, 0, 0, 0,
image.Size, CopyPixelOperation.SourceCopy);
g.Save();
}
写在一个【保存图片】的BUTTON上啊。和这个有关系吗?这个FORM上有个摄像头,摄像头区域要填充一个有透明区域的相框上。
然后还可以在这个相片上手写签字。相框和摄像头的合成没有问题。现在是不能合成手写的签名。
if(e.Button == MouseButtons.Left)
g = Graphics.FromImage(pictureBox.Image);pictureBox_MouseMove:
添加绘制签名代码pictureBox_MouseUp:
保留签名? yes: g.Save();
g.Dispose();保存图片
[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest, // 目标 DC的句柄
int nXDest,
int nYDest,
int nWidth,
int nHeight,
IntPtr hdcSrc, // 源DC的句柄
int nXSrc,
int nYSrc,
System.Int32 dwRop // 光栅的处理数值
); private void button1_Click(object sender, EventArgs e)
{
//获得当前屏幕的大小
Rectangle rect = new Rectangle();
rect = Screen.GetWorkingArea(this);
//创建一个以当前屏幕为模板的图象
Graphics g1 = this.CreateGraphics();
//创建以屏幕大小为标准的位图
Image MyImage = new Bitmap(rect.Width, rect.Height, g1);
Graphics g2 = Graphics.FromImage(MyImage);
//得到屏幕的DC
IntPtr dc1 = g1.GetHdc();
//得到Bitmap的DC
IntPtr dc2 = g2.GetHdc();
//调用此API函数,实现屏幕捕获
//BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, 0, 0, 13369376);
BitBlt(dc2, 0, 0, rect.Width, rect.Height, dc1, -400, -420, 13369376);
//释放掉屏幕的DC
g1.ReleaseHdc(dc1);
//释放掉Bitmap的DC
g2.ReleaseHdc(dc2);
MyImage.Save(@"c:\1.jpg", ImageFormat.Jpeg);
MessageBox.Show("当前屏幕已经保存为C盘的1.jpg文件!");
}
Form2已经加载完了。FROM2就是一个普通的窗体,但是我上面可以显示摄像头,这个摄像头放在一个相框的透明区域中。然后上面还有一个可以签名地方。最后合成整个图片。
Form2上可以显示摄像头,只的是从摄像头捕获的视频?那相框又是什么?
你用 printscreen 截个图贴上来看看撒~!
private System.Windows.Forms.Panel pCap;只用FORM2不用FORM1还是取不到FORM2上的合成图片。 我想要下面的合成效果。
摄像头和相框的合成没有问题:(下图)
捕获摄像头图片貌似用截屏方法是得不到的,获取的只能是视频容器的背景http://bytes.com/topic/c-sharp/answers/748322-capture-picture-digital-camera-using-c
从这个文章来看,捕获摄像头需要调用相应驱动中的dllCodeproject webcam 示例
WebCam Fast Image Capture Service using WIAdirectshow 示例 其中有好几个关于视频捕获的示例
DirectShow Samples搜索关键字 c# capture camera picture
CaptureImageTool capture = new CaptureImageTool();if (capture.ShowDialog() == DialogResult.OK) // 执行这一句时,没有设置让让窗体隐藏的属性。 可是我的主窗体还是自动隐藏了,不知道和这里有没有关系。
{ Image imagex = capture.Image;
imagex.Save(@"C:\数据保存目录\T\xx.jpeg");
}
不设置 TransparencyKey 就可以实现了吗?我的程序是两个 FORM 叠加,不设置 TransparencyKey 的话,就不能得到摄像头的图像了啊