因为一个项目,不得不将图片保存到数据库中,需要的时候再从数据库中读取.初时,以为很简单,不就是一个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. .net通过代码发送邮件

    关键代码: 需要引用命名空间: using System.Net.Mail;using System.Net; MailMessage mailObj = new MailMessage(); mai ...

  2. DatagramSocket类 会发生线程阻塞的方法

    遇到这个问题,还告诉别人错了,这里来Mark一下. receive()方法会使调用线程阻塞. Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是 ...

  3. Windows 实用小工具

    超实用的Windows工具 ====================================================================================== ...

  4. Zabbix3.4服务器的搭建--CentOS7

    本教程是目前最简单的Zabbix搭建教程.因为不是编译方式,直接用官方的分发包(rpm)安装. 1.前期准备 安装CentOS 7.4系统后.开启网络功能,其他东西均可不装.切记一定不要配置环境.还有 ...

  5. July 13th 2017 Week 28th Thursday

    No dream is too big, and no dreamer is too small. 梦想再大也不嫌大,追梦的人再小也不嫌小. Hold on to your dreams, but b ...

  6. Maven项目打包jar依赖外部jar

    有时候我们想要做一些java 的小程序,需要把打包成jar,单独执行,做一个maven项目,maven非常方便,有自动打包成jar的插件,但是有时候我们的项目可能会依赖其他的jar包,所以非常麻烦. ...

  7. 高性能计算 GPU 等资料

    从石油领域的应用看GPU.CPU算法效果比较  http://www.csdn.net/article/2011-06-21/300207 HPC 论坛 http://hpcbbs.it168.com ...

  8. (转)从信息隐藏的一个需求看C++接口与实现的分离

    原文地址https://blog.csdn.net/tonywearme/article/details/6926649 让我们从stackoverflow上一个同学的问题来开始.问题的原型是这样的( ...

  9. 第三篇——第二部分——第一文 SQL Server镜像简单介绍

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/DBA_Huangzj/article/details/26951563 原文出处:http://bl ...

  10. HDU 6370 Werewolf 【并查集】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6370 Werewolf Time Limit: 2000/1000 MS (Java/Others)   ...