TImage组件实现保存图片到Stream

所属分类: 软件编程 / Delphi 阅读数: 179
收藏 0 赞 0 分享

因为一个项目,不得不将图片保存到数据库中,需要的时候再从数据库中读取.初时,以为很简单,不就是一个Stream.事实上,也很简单.度娘一下,代码也很多,但,都是坑!

看一下TImage的源,Picture.Graphic下有一个loadfromStream和SavetoStream.如果没有猜错,那么直接用这两个函数就可以了.于是,我做了一个demo测试

demo里放了两个TImage.TImage1放一张图片,然后用代码将TImage1的图片保存到Stream.TImage2再从这个Stream中取出图片.自然水到渠成.

这就是我的代码.

 PicStream:=TMemoryStream.Create;
 Self.Image1.Picture.Graphic.SaveToStream(PicStream);
 PicStream.Position:=0;
 Self.Image2.Picture.Graphic.loadFromStream(PicStream);
 PicStream.Free;

但事实上,他出错了.于是我百度了又百度.得到的结果也是这么写的.(我不明白为什么网上有那么多有问题的代码.是版本不同的原因么)

于是我跟踪了一下他的TPicture.Assign因为如果直接用TPicture.Assign复制Timage1是没有出错的

procedure TPicture.Assign(Source: TPersistent);
begin
 if Source = nil then
  SetGraphic(nil)
 else if Source is TPicture then
  SetGraphic(TPicture(Source).Graphic)
 else if Source is TGraphic then
  SetGraphic(TGraphic(Source))
 else
  inherited Assign(Source);
end;

原来他在调用Assign的时候,会调用SetGraphic创建TGraphic对象.

所以,如果我还想要用Graphic.loadFromStream这个函数的话,就必须自己手工建创这个TGraphic对象.不然肯定是出错的.而且这TGraphic是必须根据不同的图片格式而调用不同的ClassType创建.显示麻烦了些.而我用一个TJPEGImage的对象,调用他的LoadFromStream是可以直接读取Stream的,所以就偷懒了一下

 Jpg:=TJPEGImage.Create;
 PicStream:=TMemoryStream.Create;
 Self.Image1.Picture.Graphic.SaveToStream(PicStream);
 PicStream.Position:=0;

 jpg.LoadFromStream(PicStream);
 Self.Image2.Picture.Assign(JPg);
 PicStream.Free;

本人书读的不多.这博客写得怪怪的.各位读者就将就一下.本来是不想写这博客的.但是看到网站的代码在D10下都是不可以用的.所以就献丑了.

更多精彩内容其他人还在看

Delphi实现毫秒级别的倒计时实例代码

这篇文章主要介绍了Delphi实现毫秒级别的倒计时实例代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi中对时间操作方法汇总

这篇文章主要介绍了Delphi中对时间操作方法汇总,可以对Delphi的时间操作有一个更加深入的了解,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现碰撞球体完整实例代码

这篇文章主要介绍了Delphi实现碰撞球体完整实例代码,通过该实例,读者可以完整的了解一个Delphi项目的创建过程,加深对Delphi运行原理的了解,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现读取系统时间与日期完整实例

这篇文章主要介绍了Delphi实现读取系统时间与日期完整实例,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi常用关键字用法详解

这篇文章主要介绍了Delphi常用关键字用法,包括了各个常用的关键字及其详细用法,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实例演示Rect、Bounds生成TRect的区别

这篇文章主要介绍了Delphi实例演示Rect、Bounds生成TRect的区别,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi之Pascal语言中的关键字及保留字汇总

这篇文章主要介绍了Delphi之Pascal语言中的关键字及保留字汇总,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现图片滚动切换的完整实例代码

这篇文章主要介绍了Delphi实现图片滚动切换的完整实例代码,通过本实例,读者可以进一步掌握Delphi控件及图形处理的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现图像文本旋转特效完整实例代码

这篇文章主要介绍了Delphi实现图像文本旋转特效完整实例代码,对于帮助读者进一步理解Delphi图形及文字特效的处理有一定的借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现限定软件使用时间的方法

这篇文章主要介绍了Delphi实现限定软件使用时间的方法,商业软件开发中非常实用的功能,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多