/// <summary>
/// 部分截图基本类
/// </summary>
/// <param name="sbmp"></param>
public static void PartScreenBasic(ref Bitmap sbmp, Area area)
{
sbmp = new Bitmap(area.Width, area.Height);
//创建图象,保存将来截取的图象
Graphics imgGraphics = Graphics.FromImage(sbmp);
//设置截屏区域
imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb);
}
就这一段代码 是没有问题的 对吧?
实际运用时也是没有问题的 外部有个程序在循环调用它 但是每当用个一两个小时 就会在 imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
出错,初步怀疑是系统资源的问题 但是怎么解决一直不得要领 请教高手解法
/// 部分截图基本类
/// </summary>
/// <param name="sbmp"></param>
public static void PartScreenBasic(ref Bitmap sbmp, Area area)
{
sbmp = new Bitmap(area.Width, area.Height);
//创建图象,保存将来截取的图象
Graphics imgGraphics = Graphics.FromImage(sbmp);
//设置截屏区域
imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb);
}
就这一段代码 是没有问题的 对吧?
实际运用时也是没有问题的 外部有个程序在循环调用它 但是每当用个一两个小时 就会在 imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
出错,初步怀疑是系统资源的问题 但是怎么解决一直不得要领 请教高手解法
解决方案 »
- 怎样遍历一个ILIST集合 并将其所有的数据插入到表中
- C#中TEXTBOX属性PasswordChar 只要设置字符就会出现 外部组件发生异常
- 求教:只除去字符串数组中的第一个字符,保证其它的数值不变
- Execle数据读取做条件,不知道怎么写条件了``````
- 用C#操作xml文件问题!急啊!!
- C#打包出来的程序,安装后,让一些文件(例如dll文件)安装到system32目录中,这样的话打包时应该怎么设置呢?
- 同一工厂的不同厂房分部在不同的地方,不能用内网连接,要同一数据库,程式要用何种架构
- 大家都进来看看吧
- 我受够了!!!准备从VB.NET转到C#!
- c# winform 打开图片文件
- 利用DataView的RowFilter筛选数据怎么会漏掉第一行呢?
- C#winform编程实现打开我的电脑
个人意见绿绦工作室 http://www.lvtaostudio.com
Image img = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g = Graphics.FromImage(img);
g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
MemoryStream ms = new MemoryStream();
// pictureBox1.Image = img;
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, img);//客户端反序列化
byte[] ScreenByte = obj.GetScreen();//obj对象调用以上代码
MemoryStream ms = new MemoryStream(ScreenByte);
BinaryFormatter bf = new BinaryFormatter();
pictureBox1.Image=(Image)bf.Deserialize(ms);
楼主,参考。这是我以前写的代码
Graphics g = Graphics.FromImage(img);
g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
pictureBox1.Image = img;
截屏幕其实就是这么5句话。
System.Drawing.Size sz = new Size(800, 600);
while (true)
{
using (Bitmap bm = new Bitmap(1, 1))
{
//创建图象,保存将来截取的图象
using (Graphics imgGraphics = Graphics.FromImage(bm))
{
//设置截屏区域
imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);
}
Console.WriteLine(i);
i++;
}已经改成这样 还是在9950次左右 提示同样错误 到底是哪里泄漏了?
}
using和GC.collect()
做的事情可不一样哦~
imgGraphics.Dispose();
public static void PartScreenBasic(ref Bitmap sbmp, Area area)
{
// sbmp = new Bitmap(area.Width, area.Height);
//创建图象,保存将来截取的图象
// Graphics imgGraphics = Graphics.FromImage(sbmp);
//设置截屏区域
// imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size
(area.Width, area.Height));
// sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb); sbmp.dispose();
imgGraphics.dispose();
}
{
int i = 0;
System.Drawing.Size sz = new Size(800, 600);
while (true)
{
using (Bitmap bm = new Bitmap(1, 1))
{
//创建图象,保存将来截取的图象
using (Graphics imgGraphics = Graphics.FromImage(bm))
{
//设置截屏区域
imgGraphics.CopyFromScreen(0, 0, 0, 0, sz);
imgGraphics.Dispose();
}
Console.WriteLine(i);
i++;
} }
//return; }
内存使用量减少了很多 9950次时原来是45000K左右 现在是39740K 但是还是在9951次时同样错误
bitmap 不能释放啊 ref传进来的 要回去处理的
不过我再试试把bitmap也释放看
{
int i = 0;
System.Drawing.Size sz = new Size(800, 600);
while (true)
{
Bitmap bm = new Bitmap(1, 1);
//创建图象,保存将来截取的图象
Graphics imgGraphics = Graphics.FromImage(bm); //设置截屏区域
imgGraphics.CopyFromScreen(0, 0, 0, 0, sz); bm.Dispose();
imgGraphics.Dispose();
Console.WriteLine(i);
i++;
}
}
万恶的9951 我实在是没办法了 还是在第9951次报错
{
int i = 0;
System.Drawing.Size sz = new Size(800, 600);
while (true)
{
Bitmap bm = new Bitmap(1, 1);
//创建图象,保存将来截取的图象
Graphics imgGraphics = Graphics.FromImage(bm); //设置截屏区域
imgGraphics.CopyFromScreen(0, 0, 0, 0, sz); bm.Dispose();
imgGraphics.Dispose();
Console.WriteLine(i);
i++;
}
}你的程序我跑了一下,的确也是在9951上报“参数无效”
我修改了一下就好了。但不知道是否满足你的需求private void button7_Click(object sender, EventArgs e)
{
int i = 0;
Bitmap bm = new Bitmap(1, 1);
System.Drawing.Size sz = new Size(800, 600);
while (true)
{
//Bitmap bm = new Bitmap(1, 1);
//创建图象,保存将来截取的图象
Graphics imgGraphics = Graphics.FromImage(bm); //设置截屏区域
imgGraphics.CopyFromScreen(0, 0, 0, 0, sz); //bm.Dispose();
imgGraphics.Dispose();
Console.WriteLine(i);
i++;
}
}
/// 部分截图基本类
/// </summary>
/// <param name="sbmp"> </param>
public static void PartScreenBasic(ref Bitmap sbmp, Area area)
{
sbmp = new Bitmap(area.Width, area.Height);
//创建图象,保存将来截取的图象
Graphics imgGraphics = Graphics.FromImage(sbmp);
//设置截屏区域
imgGraphics.CopyFromScreen(area.Left, area.Top, 0, 0, new Size(area.Width, area.Height));
sbmp = sbmp.Clone(new Rectangle(0, 0, sbmp.Width, sbmp.Height), PixelFormat.Format24bppRgb);
}
我的程序是这样的 功能是定制截屏 有时可能不止一个bitmap对象
TKS wdgphc 这样问题肯定出在bitmap对象创建次数太多而释放不完全上 这样的话 可以应该可以在静态类上声明一个全局的bitmap数组 有10个应该足够了 循环使用不创建太多的bitmap 这样的话还要管理这个数组哦 要是能完全解决就好了
不过这种办法比我现在用的好 呵呵 我现在是直接9000次时重新打开相同程序 并关掉当前程序
我再研究研究
这个里面已经调用了dispose方法了但是还是出错
public void GetImage()//打印屏幕
{
try
{
string tempImagePath = Application.StartupPath;
string temp = tempImagePath + "\\MonitorImage";
Directory.CreateDirectory(@temp);
Image i = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(i);
g.CopyFromScreen(new Point(this.Location.X, this.Location.Y), new Point(0, 0), new Size(this.Width, this.Height));
i.Save(@temp + "\\" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString() + ".jpg");
g.Dispose();
CommonClass.MessageBoxOK("截图成功!");
}
catch
{
CommonClass.MessageBoxNo("截图失败!");
}
}
新改的程序只用了一个bitmap 只new了一次
使用的时间长了许多但是还是会有内存不足 唉
感谢大家提供的思路
感谢 wdgphc 兄热情测试