C#线程中Image.FromFile()处提示内存不足

遥新 2014-05-22 03:00:40
我在一个窗体的Load事件中创建了一个线程,在线程中用while循环判断一个文件夹下是否存在特定名称的三张jpg图片,当这三张图片出现时将它们显示在窗体的三个pictureBox中。线程如下:
private void thread_refresh()
{
string pic_name1 = "C:\\WasteManage\\DigRec\\image\\pic-cam1.jpg";
string pic_name2 = "C:\\WasteManage\\DigRec\\image\\pic-cam2.jpg";
string pic_name3 = "C:\\WasteManage\\DigRec\\image\\pic-cam3.jpg";
bool pic_exist1 = File.Exists(pic_name1);
bool pic_exist2 = File.Exists(pic_name2);
bool pic_exist3 = File.Exists(pic_name3);
while (!pic_exist1 || !pic_exist2 || !pic_exist3)
{
pic_exist1 = File.Exists(pic_name1);
pic_exist2 = File.Exists(pic_name2);
pic_exist3 = File.Exists(pic_name3);
}

Image pic1 = Image.FromFile("C:\\WasteManage\\DigRec\\image\\pic-cam1.jpg");
Image bmp1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);

Graphics g1 = Graphics.FromImage(bmp1);
g1.DrawImage(pic1, new Rectangle(0, 0, bmp1.Width, bmp1.Height), new Rectangle(0, 0, pic1.Width, pic1.Height), GraphicsUnit.Pixel);
g1.Flush();
g1.Dispose();
pic1.Dispose();
pictureBox1.Image = bmp1;

Image pic2 = Image.FromFile("C:\\WasteManage\\DigRec\\image\\pic-cam2.jpg");
Image bmp2 = new Bitmap(pictureBox2.Width, pictureBox2.Height);
Graphics g2 = Graphics.FromImage(bmp2);
g2.DrawImage(pic2, new Rectangle(0, 0, bmp2.Width, bmp2.Height), new Rectangle(0, 0, pic2.Width, pic2.Height), GraphicsUnit.Pixel);
g2.Flush();
g2.Dispose();
pic2.Dispose();
pictureBox2.Image = bmp2;

Image pic3 = Image.FromFile("C:\\WasteManage\\DigRec\\image\\pic-cam3.jpg");
Image bmp3 = new Bitmap(pictureBox3.Width, pictureBox3.Height);
Graphics g3 = Graphics.FromImage(bmp3);
g3.DrawImage(pic3, new Rectangle(0, 0, bmp3.Width, bmp3.Height), new Rectangle(0, 0, pic3.Width, pic3.Height), GraphicsUnit.Pixel);
g3.Flush();
g3.Dispose();
pic3.Dispose();
pictureBox3.Image = bmp3;
}
现在遇到问题就是运行时经常会出错,在红色代码处提示内存不足,但不是每次都出错,网上查了一下有人说可能是没有连续的内存空间存放图片,我的图片每张是5MB多,是这个原因吗?该如何解决?
...全文
2190 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
遥新 2014-05-22
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
具体你内存多大会造成不足,我也不是很清楚. 不过可以先给你点小的建议: while循环里要加sleep,不要让cpu每个周期都去做判断,那样不仅你内存吃紧,cpu负担也很重.
谢谢,问题解决了,是图片问题,实验图片是被我从.bmp直接重命名为.jpg的,在这里出了差错。
遥新 2014-05-22
  • 打赏
  • 举报
回复
引用 7 楼 sunny906 的回复:
只要你把图片大小转换为显示的大小就不会有问题啊
恩,问题解决了,是图片问题,可能损坏了。
E次奥 2014-05-22
  • 打赏
  • 举报
回复
分割成小块读取,显示的时候在合成一张
於黾 2014-05-22
  • 打赏
  • 举报
回复
具体你内存多大会造成不足,我也不是很清楚. 不过可以先给你点小的建议: while循环里要加sleep,不要让cpu每个周期都去做判断,那样不仅你内存吃紧,cpu负担也很重.
sunny906 2014-05-22
  • 打赏
  • 举报
回复
只要你把图片大小转换为显示的大小就不会有问题啊
遥新 2014-05-22
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
[quote=引用 3 楼 yaoxinreaps 的回复:] [quote=引用 1 楼 Z65443344 的回复:] pictureBox1.Image = Image.FromFile(filename) 不需要你自己再画来画去的了.
这是因为我还有后续操作要把图片删除,直接这样的话删不掉,会提示图片正在被另一个程序调用,当时也是费了劲才解决的这个问题。[/quote] 你这样做跟把图片copy到临时文件夹里显示有什么区别么...除了更占内存之外.[/quote] 这不是刚接触c#毫无经验吗,过程也是东查西查的,勉强凑到一起的。
遥新 2014-05-22
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
再有就是没看懂你程序这样做有什么意义. 为什么不找到一张就显示一张,而必须3张都存在才一起显示? 而且,后台文件是随时在改变的么,为什么会出现找不到文件的情况,还要先做是否存在的判断?
这是我程序中的一小段,我有三个摄像头,要排齐了三张图片再显示,图片处理好了要删除,然后继续拍,但是摄像头是触发的,不知道图片什么时候会出现,所以要查看它是否存在。这么做都是有原因的。你觉得我的问题该怎么解决?
於黾 2014-05-22
  • 打赏
  • 举报
回复
引用 3 楼 yaoxinreaps 的回复:
[quote=引用 1 楼 Z65443344 的回复:] pictureBox1.Image = Image.FromFile(filename) 不需要你自己再画来画去的了.
这是因为我还有后续操作要把图片删除,直接这样的话删不掉,会提示图片正在被另一个程序调用,当时也是费了劲才解决的这个问题。[/quote] 你这样做跟把图片copy到临时文件夹里显示有什么区别么...除了更占内存之外.
遥新 2014-05-22
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
pictureBox1.Image = Image.FromFile(filename) 不需要你自己再画来画去的了.
这是因为我还有后续操作要把图片删除,直接这样的话删不掉,会提示图片正在被另一个程序调用,当时也是费了劲才解决的这个问题。
於黾 2014-05-22
  • 打赏
  • 举报
回复
再有就是没看懂你程序这样做有什么意义. 为什么不找到一张就显示一张,而必须3张都存在才一起显示? 而且,后台文件是随时在改变的么,为什么会出现找不到文件的情况,还要先做是否存在的判断?
於黾 2014-05-22
  • 打赏
  • 举报
回复
pictureBox1.Image = Image.FromFile(filename) 不需要你自己再画来画去的了.

111,104

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧