因为一个项目,不得不将图片保存到数据库中,需要的时候再从数据库中读取.初时,以为很简单,不就是一个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:=;
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:=; jpg.LoadFromStream(PicStream);
Self.Image2.Picture.Assign(JPg);
PicStream.Free;

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

TImage保存图片到Stream及从Stream中取图片的更多相关文章

  1. 在stream流和byte[]中查找(搜索)指定字符串

    在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream 类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的“ ...

  2. [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

    Stream的概念定义   官方文档是永远的圣经~     表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.s ...

  3. Java8 关于stream.foreach()和stream.peek()的区别解析

    该思考来源于日常工作中,特记此心得. 思考:如何快速将list中的每个item内部属性值改变并进行其他流体操作呢? 下面做个测试:如何先在list中统一改变某属性的值,然后再根据某个属性取出该属性值最 ...

  4. Stream入门及Stream在JVM中的线程表现

    继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式. 小实验引入: 这 ...

  5. 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值

    不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常: java.lang.NullPointerException java.ut ...

  6. LeetCode 346. Moving Average from Data Stream (数据流动中的移动平均值)$

    Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...

  7. NodeJS 难点(网络,文件)的 核心 stream 二:stream是什么

    对于大部分有后端经验的的同学来说 Stream 对象是个再合理而常见的对象,但对于前端同学 Stream 并不是那么理所当然,github 上甚至有一篇 9000 多 Star 的文章介绍到底什么是 ...

  8. Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (3) - Stream的终端操作

    Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...

  9. Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (2) - Stream的中间操作

    Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...

随机推荐

  1. Python unittest模块心得(一)

    关于unittest模块的一些心得,主要是看官网的例子,加上一点自己的理解,官网地址:https://docs.python.org/3.6/library/unittest.html 基础概念介绍: ...

  2. Python学习---进程 1225

    进程创建 进程创建: 第一种:直接创建 第二种:利用类来实现 第一种:直接创建 from multiprocessing import Process import time def f(name): ...

  3. DESCRIBE:When you mouse click right-side is open an application and click left-side is attribution.

    DESCRIBE:When  you mouse click right-side is open an application and click left-side is attribution. ...

  4. linux 用户切换 标签: linux 2016-07-30 13:57 144人阅读 评论(0) 收藏

    一.指令修改 1.普通用户切换到root用户: su root 需要输入密码 2.root用户切换到普通用户: su 用户名 不需要输入密码 二.直接注销,再用新用户登录 注:1.两种方式存在差别,用 ...

  5. OID OAM WLS等Oracle 中间件日志位置汇总

    WLS的log:/tip/IMP/bea/user_projects/domains/IDMDomain/servers/AdminServer/logsOID的log:/tip/IMP/bea/us ...

  6. python数据处理——numpy

    标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针.这样为了保存一个简单的[1,2,3],需要有3个指针和三个 ...

  7. UEditor 中配置可以跨域访问的图片路径

    文档里很清楚:http://fex.baidu.com/ueditor/#server-path 进入配置文件 当域名不是直接配置到项目根目录时,例:http://a.com/b/c  域名下有两文件 ...

  8. NPM cache相关

    今天下午把package.lock.json用别人的替换了,然后编译一堆报错,这个问题弄了一下午. 总结一下经验: 1.关于npm cache NPM会把所有下载的包保存,放在用户文件夹下面,在我的w ...

  9. No module named _sqlite3

    [root@lgj01 opsadmin]# python manage.py startapp accountTraceback (most recent call last):  File &qu ...

  10. ZOJ-3286 Very Simple Counting---因子数打表

    题目链接: https://cn.vjudge.net/problem/ZOJ-3286 题目大意: f(n)为n的因子个数 求出有多少个f(i)使得f(i) == f(n) && i ...