Image加载图片太占内存了吧(20)

  • 主题发起人 主题发起人 zqssoft
  • 开始时间 开始时间
Z

zqssoft

Unregistered / Unconfirmed
GUEST, unregistred user!
内存大得离谱用Delphi建立一新工程,一个窗口,再添加一个Image控件,用代码加载一幅2MB左右的数码相机照片,内存竟然从4MB升到了30MB,我晕,为什么?uses jpeg;Image1.Picture.LoadFromFile('D:/200905/IMG_5158.jpg');如何做,才能即加载这幅图片,同时又能把这20多MB的内存占用率节省下来,以使程序更快,内存占用率更小?
 
计算机处理图形必要的消耗。用mspaint.exe或者其他程序打开这幅图看看内存的消耗就知道了。
 
我试了下另一个图片显示程序,人家的是内存猛然升到30MB,随后又降低到程序自身5MB左右了,但图片仍然被缩小显示了出来。为什么我的图形显示出来时,就一直保持在30MB而不能迅速下降到程序自身的水平呢,如何做才能把图片显示出来又把内存降下来?
 
你在内存做和小图就可以,还有的是把图形按格式分块绘制的 不过bmp图形还简单点 只要知道格式头内容比较好处理,其他格式的就郁闷了以前高过jpeg的要用哪个算法分块接压,没有搞出来,哪个是做webgis的就是电子地图,一个原始文件20m 接压计算机以下就挂了
 
呵呵~加载时把图缩小就可以了~
 
给你推荐一本书: Delphi数字图像处理及高级应用
 
Windows只能处理位图,你的Jpg实际上要在内存中解压成位图才显示的.2MB的JPG解压成20MB的位图也不稀奇啊
 
同意楼上的说法。其实你可以将图片进行一些转换,如果显示器分辨率只有1024*768,那将这个图片转换成1024*768大小的BMP文件,然后再调用,这样内存占用就会小的很多。
 
在Delphi中,用GDI+库加载,总共只占12MB左右内容。
 
有可能使用压缩内存的方式,这样就不真实了
 
参考下我下面写的代码:uses Jpeg; const DiskJpegFile = 'DSC_0050.JPG';var Bmp: TBitmap;// 实用函数 - 把磁盘 Jpeg 图形 加载到 Bmp 对象中 procedure LoadJpeg2Bmp(JpgFile:AnsiString; Bmp: TBitmap);var JpgImage: TJpegImage;begin if not Assigned(Bmp) then exit; if FileExists(JpgFile) then begin JpgImage := TJpegImage.Create; try JpgImage.LoadFromFile(JpgFile); Bmp.SetSize(JpgImage.Width, JpgImage.Height); Bmp.Canvas.Draw(0, 0, JpgImage); finally JpgImage.Free; end; end;end;// 按钮按下: 把 Jpeg 图形 转移到 BMPprocedure TForm1.Button1Click(Sender: TObject);begin if FileExists(DiskJpegFile) then begin if Assigned(Bmp) then Bmp.Free; Bmp := TBitmap.Create; LoadJpeg2Bmp(DiskJpegFile, Bmp); end;end;// 按钮按下: 画 BMP 图形到 Form 上显示procedure TForm1.Button2Click(Sender: TObject);begin if not Assigned(Bmp) then exit; Canvas.StretchDraw(ClientRect, Bmp);end;上面代码演示类似效果,并解答你内存占用的问题。在 Jpeg 文件从磁盘加载到 TJpegImage 对象中时,由于没有执行解码操作,内存不会突然上升,只有当Jpeg图形画到Bmp时,才发生30M左右的大内存使用,当用完后,你只要释放 Jpeg对象,内存就自然恢复到一个很小的值了。
 
修改Jpg文件每英寸像素数,图片将就不会太大了,人的眼睛能接受就行了
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部