如何从TGraphicField中提取位图?

 爱音乐的李雪梅 发布于 2023-02-07 17:42

我疯了.

这就是我在做什么

    在表单上删除TClientDataset,TImage和TButton.

    将Clientdataset1.Filename设置为biolife.xml

    双击按钮并添加以下代码:

    procedure TForm31.Button1Click(Sender: TObject);
    var
      BF: TBlobField;
      BS: TStream;
      BM: TBitmap;
    begin
      ClientDataset1.Open;
      ClientDataset1.First;
      BF :=  ClientDataSet1.FieldByName('Graphic') as TBlobField;
      BS := ClientDataSet1.CreateBlobStream(BF, bmRead);
      BS.Position := 0;
      BM := TBitmap.Create;
      try
        BM.LoadFromStream(BS);
      finally
        BM.Free;
      end;
    end;
    

运行.当我这样做时,我得到"位图图像无效".

咦?这些数据多年来一直是位图 - 出了什么问题?

1 个回答
  • 如果您将TGraphicField文件保存(使用它的SaveToFile方法)并使用十六进制查看器查看该文件,它确实是一个位图.问题是在开头有一个描述文件类型的blob头.这在文档中有点含糊地提到.我还在文档中的TBlobField.GraphicHeader属性描述中找到了对它的引用.

    如果设置Stream.Position为8而不是0,则它会正确读入a TBitmap.

    BS.Position := 8;
    BM.LoadFromStream(BS);
    

    2023-02-07 17:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有