zoukankan      html  css  js  c++  java
  • TImage保存图片到Stream及从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下都是不可以用的.所以就献丑了.

  • 相关阅读:
    Python学习(五)函数 —— 自定义函数
    Python学习(四)数据结构 —— dict
    Python学习(四)数据结构 —— set frozenset
    C++ —— 构建开源的开发环境
    Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(使用语法)
    Web —— tomcat 问题解决
    web —— jsp笔记
    Web 前端 —— javaScript
    编程杂谈—— 浮点数
    Web —— java web 项目开发 笔记
  • 原文地址:https://www.cnblogs.com/wuxi15/p/5453622.html
Copyright © 2011-2022 走看看