TImage组件实现保存图片到Stream_Delphi

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索stream
timage
delphi timage、delphi timagelist、delphi timage 类别、delphi timage 闪屏、delphi timage 保存,以便于您获取更多的相关知识。

时间: 2024-09-13 03:41:01

TImage组件实现保存图片到Stream_Delphi的相关文章

Delphi实现提取可执行文件内部所有图标

本实例实现的功能是能够从用户选择的可执行文件(后缀名为exe)中提取所有图标并且显示在窗体上. 在窗体中添加TImage 组件.TOpenDialog组件和TButton组件,TImage组件充当显示文件内图标的容器,TOpenDialog组件和TButton组件用来激活提示用户选择GIF动画的对话框.添加组件后的窗体如图1所示. 图1 添加组件后的窗体 首先在窗体的uses段中添加ShellAPI,然后添加按钮响应代码如下: procedure TfrmMain.btnOpenClick(Se

C++ Builder文件任意分割传输技术

一. 前言 目前网络编程技术有很多,一般都是直接利用编程软件自带的功能函数或控件来完成,用户不必关心低层的操作,确实带来方便.但灵活性不够,如果要传输的文件比较大,则速度慢.如果网络的断线率高,则不得不重新传输.本程序可以克服以上不足,将任意大小的文件视网络状况在客户端分割成任意大小的数据流进行发送,在服务端接收数据流,并组装成原文件.如果网络被中断,则记下位置,待网络恢复后继续从断点的位置传输,终端继续接收,直到传输完毕. 本程序在Windows2000调试通过,读者可以应用本程序的设计技术应

Delphi实现在数据库中存取图像

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

Delphi编程轻松实现大图像浏览

本实例演示如何不用添加代码就可轻松浏览大图像.当图像的尺寸大于显示区的大小时,就会自动显示滚动条,拖动这些滚动条就可以浏览显示区以外的图像. 在窗体中添加一个TScrollBox组件,设置AutoScroll属性为True.然后在TScrollBox组件上添加一个TImage组件,设置Align属性为alNone,AutoSize属性为True,并且为TImage组件加载一幅大图像. 经过以上的设置,TImage组件就会根据图像的大小自动调节尺寸.与此同时,TScrollBox组件就会自动设置滚

用Delphi实现图像放大镜

在一些常用的看图软件中都带有一个可以放大局部图像的功能,本实例就是为模仿这一功能开发的. 向窗体上添加两个TImage组件,其中一个TImage组件的Name属性设置为Image1,它充当原图片显示的载体.另一个TImage组件的Name属性设置为Image2,它可以显示放大后的图像.添加组件后的窗体如图1所示. 图1 添加组件后的窗体 本例的核心是StretchBlt函数,利用StretchBlt函数实现局部图像放大,响应代码如下: procedure TForm1.Image1MouseMo

在C++ Builder中显示透明位图

我们知道,GIF类型的图像格式支持透明显示,而BMP类型的图像格式不支持透明显示.在Microsoft照片编辑器中位图若以设置成透明色方式存储,则提示出错.然而,在C++Builder中,却可以轻而易举地显示透明位图.透明位图与透明GIF图像相比有一个很大的优点,即:GIF图像格式最大支持256种颜色,位图却可以支持真彩色. ----在C++Builder中显示透明位图 ----1.采用TImage组件. ----下面,我们制作一幅飞机凌空飞过蓝天的简单动画.因为移动的飞机是用透明位图显示的,所

用C++ Builder对图像进行特殊效果处理

在Windows编程中图像处理相对比较复杂,好在C++ Builder提供了一些图形类,它们通过对Windows中的图形对象进行包装,从而大大简化了图像操作的难度.下面就通过对图像进行柔化.锐化.浮雕效果等几个特殊效果处理来具体说明一下. 一.准备工作 位图图形实际上是像素的二维数组,它记录了每个像素的颜色信息,而TCanvas类提供了Pixels属性,用它可以存取指定像素的颜色值,通过这个属性将位图图形的部分或全部像素的颜色值进行相应的变换处理,就可以实现图像的特殊效果处理.在Windows中

在BCB中轻松使用ActiveX控件

在微软的大力扶持下,越来越多的软件公司开始支持ActiveX了,这对于喜欢编程的朋友来说可是件值得高兴的事!因为我们可以在程序中很方便地调用外部的OCX文件来实现复杂的功能,而在BCB中只带有很少几个ActiveX控件,大部分我们需要我们自己安装,下面通过对RealPlayer与Flash控件的安装与应用,让我们共同来学习ActiveX的组件在BCB中的使用方法:) 一.安装.导入ActiveX控件 C++ Builder在对ActiveX的支持方面可说是做得非常出色,我们可以很方便地导入系统中

092_《Delphi6高级编程》

<Delphi6高级编程> Delphi 教程 系列书籍 (092) <Delphi6高级编程> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: 下载 作者: 飞思科技产品研发中心 丛书名: 开发专家之Delphi 出版社:电子工业出版社 ISBN:7505373609 上架时间:2002-2-7 出版日期:2002 年1月 页码:646 版次:1-1 内容简介 本书属于<开发专家之DelPhi>系列.Delphi 6是Borland公司推出的