TImage组件实现保存图片到Stream

因为一个项目,不得不将图片保存到数据库中,需要的时候再从数据库中读取.初时,以为很简单,不就是一个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下都是不可以用的.所以就献丑了.

(0)

相关推荐

  • Delphi基本图像处理方法汇总

    本文实例汇总了Delphi基本图像处理方法.分享给大家供大家参考.具体分析如下: //浮雕 procedure Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer);overload; var i, j, Gray, Azimuthvalue, R, G, B: integer; SrcRGB, SrcRGB1, SrcRGB2, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height -

  • delphi实现保存和读取图片的方法

    本文实例讲述了delphi实现保存和读取图片的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法如下: 首先引用jpeg 1.显示图片: if OpenPictureDialog.Execute then begin img1.Picture.LoadFromFile(OpenPictureDialog.FileName); btnPicture.Text:=OpenPictureDialog.FileName; end; 2.保存图片: var Stream:TMemoryStream

  • 在Delphi实现在数据库中存取图像的图文演示无错

    本实例演示如何在数据库中存取图像文件. 向窗体上添加一个TListBox组件.一个TImage组件和一个TTable组件,设计完成的主界面如图1所示. 图1 主界面 本系统中需要设计一个新的基于Paradox 7的数据库Image.db,图2为设计完成的Image.db数据库. 图2 设计完成的数据库 为了方便测试程序,Image.db数据库存储在实例程序所在的路径下. 设置TTable组件的TableName属性为Image.db,Active属性为True. 在程序运行初期,首先会判断Ima

  • TImage组件实现保存图片到Stream

    因为一个项目,不得不将图片保存到数据库中,需要的时候再从数据库中读取.初时,以为很简单,不就是一个Stream.事实上,也很简单.度娘一下,代码也很多,但,都是坑! 看一下TImage的源,Picture.Graphic下有一个loadfromStream和SavetoStream.如果没有猜错,那么直接用这两个函数就可以了.于是,我做了一个demo测试 demo里放了两个TImage.TImage1放一张图片,然后用代码将TImage1的图片保存到Stream.TImage2再从这个Strea

  • 详解Flutter中数据传递的方式

    目录 1.构造方法传递 2.InheritedWidget 3.Notification 4.Stream & event_bus 在Flutter中,常见的数据传递一共有以下几种: 1.构造方法传递 Flutter的构造方法具备着dart语言的特点,参数具备可选状态,通过构造方法传递数据,可以很方便的将任意数据进行传递,平时开发中,A跳转B页面最常用的方法就是通过构造方法进行传递.比如我们最常见的Key就是通过构造一级一级向下传递的. 优点: 相邻页面之间传递数据非常方便,你不需要进行任何额外

  • windows2008+iis7无组件上传写入文件失败ADODB.Stream 错误 800a0bbc问题

    现象:写入文件失败,ADODB.Stream 错误 800a0bbc 条件:在已排除一般的解决方法文件夹权限后,并且服务器为windows2008 希望写这文章可以让大家避免浪费太多时间,最快地解决问题. 一个ASP程序用到无组件上传,在本地XP SP3 IIS5.1及在Windows Server 2003 + IIS6.0上测试均为可以正常上传.到把程序放了windows2008+IIS7.0上发现内部服务器错误500,最后我把其调为可显示详细错误信息,显示为: 写入文件失败,ADODB.S

  • 关于用ADO STREAM做的无组件上传程序简单介绍

    前面有人贴了用ADO STREAM做的无组件上传程序,今天我做一下关于它的简单介绍 以前,如果要用ASP操作文件,比如移动.复制.删除或者创建一个记事本文件,基本上都是通过FILESYSTEMOBJECT对象做的,当然,这个东西很专业,也没说什么不好,它可以提供完善的文件信息,比如建立时间,大小,上次修改时间等等,但是如果你不做痛苦的高代价的字符格式转换的话,利用它你无法直接操作二进制文件. 但是,现在我们介绍的stream物件可以同时操作文本对象和二进制对象,要求是您的机器上要安装有ADO2.

  • Spring Cloud Stream消息驱动组件使用方法介绍

    目录 1.Stream解决的痛点问题 2.Stream重要概念 3.传统MQ模型与Stream消息驱动模型 4.Stream消息通信方式及编程模型 4.1.Stream消息通信方式 4.2.Stream编程注解 4.3.Stream消息驱动之开发生产者端 4.4.Stream消息驱动之开发消费者端 5.Stream高级之自定义消息通道 6.Stream高级之消息分组 MQ:消息队列/消息中间件/消息代理,产品有很多,ActiveMQ RabbitMQ RocketMQ Kafka 1.Strea

  • ADODB.Stream组件Charset属性值集合

    翻了半天MSDN后找到的,|后边是别名 复制代码 代码如下: ANSI_X3.4-1968|iso-8859-1  ANSI_X3.4-1986|iso-8859-1  arabic|iso-8859-6  ascii|iso-8859-1  ASMO-708  Big5  chinese|gb2312  CN-GB|gb2312  cp1256|windows-1256  cp367|iso-8859-1  cp819|iso-8859-1  cp852|ibm852  cp866|ibm86

  • 一个带采集远程文章内容,保存图片,生成文件等完整的采集功能

    复制代码 代码如下: '================================================== '函数名:GetHttpPage '作 用:获取网页源码 '参 数:HttpUrl ------网页地址 '================================================== Function GetHttpPage(HttpUrl) If IsNull(HttpUrl)=True Or Len(HttpUrl)<18 Or HttpUr

  • Stream、WshShell、WshUrlShortcut对象及Shell.Application的参数与使用

    Kafree收集整理 来源:论坛转载无法确定出处,如有版权问题请与我们联系 1.Stream对象 组件:"Adodb.Stream"  有下列方法:  Cancel 方法   使用方法如下   Object.Cancel   说明:取消执行挂起的异步 Execute 或 Open 方法的调用.  Close 方法   使用方法如下   Object.Close   :关闭对像  CopyTo 方法   使用方法如下   Object.CopyTo(destStream,[CharNum

随机推荐