Image.FromFile 为何如此占用内存?

时间:2022-02-08 19:50:45
有4个JPG文件,每个大约800kB,大小为2288x1712,颜色24位。在 WinForm 中放了4 个 PictureBox,来显示这4个图片:

private void button3_Click(object sender, System.EventArgs e)
{
Image oImage;

oImage = Image.FromFile( @"J:\z\1\1.jpg" );
this.pictureBox1.Image = oImage;  

oImage = Image.FromFile( @"J:\z\1\2.jpg" );
this.pictureBox2.Image = oImage;  

oImage = Image.FromFile( @"J:\z\1\3.jpg" );
this.pictureBox3.Image = oImage;  

oImage = Image.FromFile( @"J:\z\1\4.jpg" );
this.pictureBox4.Image = oImage;  
}

发现每次执行 oImage = Image.FromFile(...) 后,内存占用(物理内存与虚拟内存之和)平均增长约23MB,执行完此次Button 的点击操作,内存占用从22MB上升到117MB.

如果执行:

private void button2_Click(object sender, System.EventArgs e)
{
this.pictureBox4.Image.Dispose();
this.pictureBox4.Image = null; 

this.pictureBox3.Image.Dispose();
this.pictureBox3.Image = null; 

this.pictureBox2.Image.Dispose();
this.pictureBox2.Image = null; 

this.pictureBox1.Image.Dispose();
this.pictureBox1.Image = null; 
}

则可以释放占用的内存,每次释放约23MB,整体从117MB释放到22MB.

如果图片在内存中以 BMP 方式存放,大小应为 2288x1712x3(24bits)=12MB,即使以32位颜色存放应为16MB. 那 oImage = Image.FromFile(...)  占用的另外一部分内存做什么用了?

有没用其他方法满足我同时显示4个图片的要求又不占用如此多的内存?

10 个解决方案

#1


因为打开的是位图数据。

#2


up

#3


猜测:
jpg是压缩格式的位图,它本身不是真正的原始位图,进入内存后,要经过一定的算法的才能成为原始位图,也就是说,内存中的才是真正原始位图的大小,这时,它是未压缩的,并以纯二进制表示的,所以占用内存超出文件的大小。

你可以再找一个bmp的试试,如果以上猜测正确,bmp读入内存后,与原始文件大小区别不大。

#4


应该没有什么好的方法。我从前做过一个类似的简单图像处理软件,带批处理,内存消耗的确比较大,但也在可以忍受的范围内。

#5


如果太占用内存,就不用了,可以使用ImageList

#6


啊,没看清你写的东西,不好意思,说了废话..................

#7


GDI+的问题........

#8


图片存为24位BMP文件,大小为12M. 用 oImage = Image.FromFile(...)  后内存占用增加35M.

#9


mark

#10


用gif呢

#1


因为打开的是位图数据。

#2


up

#3


猜测:
jpg是压缩格式的位图,它本身不是真正的原始位图,进入内存后,要经过一定的算法的才能成为原始位图,也就是说,内存中的才是真正原始位图的大小,这时,它是未压缩的,并以纯二进制表示的,所以占用内存超出文件的大小。

你可以再找一个bmp的试试,如果以上猜测正确,bmp读入内存后,与原始文件大小区别不大。

#4


应该没有什么好的方法。我从前做过一个类似的简单图像处理软件,带批处理,内存消耗的确比较大,但也在可以忍受的范围内。

#5


如果太占用内存,就不用了,可以使用ImageList

#6


啊,没看清你写的东西,不好意思,说了废话..................

#7


GDI+的问题........

#8


图片存为24位BMP文件,大小为12M. 用 oImage = Image.FromFile(...)  后内存占用增加35M.

#9


mark

#10


用gif呢