首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将(Jpeg)图像保存到MySql并在以后检索它?

问如何将(Jpeg)图像保存到MySql并在以后检索它?
EN

Stack Overflow用户
提问于 2010-11-17 11:26:16
回答 3查看 16.6K关注 0票数 1

寻找代码样本,最好使用TADOConnection。

我希望将TImage的TPicture保存到MySql (最好是ODBC,而不仅仅是MySql)数据库,稍后我想创建一个TImage并将图片检索到它的TPicture属性。

是否有代码片段,或链接到相同的代码片段?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-17 19:53:12

您可以使用BLOB字段。假设您有一个TAdoDataset实例,并且您想要编辑一个图像字段。您可以使用如下代码:

代码语言:javascript
复制
  AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
    if ADODataSet1.Active then
    begin
      ADODataSet1.Edit;
      TBlobField(ADODataSet1.FieldByName('MyField')).LoadFromStream(AStream);
      ADODataSet1.Post;
    end;
  finally
    AStream.Free;
  end;

您还可以使用DBImage控件,该控件是数据感知的,将任何图像加载到该控件中意味着将该图像加载到字段中。

要检索字段数据并将其加载到TImage实例中,可以使用如下代码:

代码语言:javascript
复制
var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    if ADODataSet1.Active then
    begin
      TBlobField(ADODataSet1.FieldByName('MyField')).SaveToStream(AStream);
      AStream.Position := 0;
      Image1.Picture.Graphic.LoadFromStream(AStream);
    end;
  finally
    AStream.Free;
  end;
end;

警告:在这段代码中,我假设Image1.Picture.Graphic不是Nil。如果您的图像控件为空,则Picture.Graphic属性为Nil,并且上面的代码将给您带来访问冲突。有两种方法可以避免这种情况:

  1. 不是将图像保存到内存流中,而是将其保存到本地临时文件中,然后使用Image1.Picture.LoadFromFile加载图片。LoadFromFile检查文件扩展名,并根据文件扩展名,从TGraphics子类之一创建适当的对象。例如,如果文件是JPEG,它会创建一个TJPEGImage类的实例,并将数据加载到其中。
  2. 您可以自己创建适当的对象并将其分配给Image1.Picture.Graphic。例如,如果图像是JPEG,则创建一个TJPEGImage实例,将流加载到其中,然后将其分配给JPEG。

如果使用SQL命令(INSERT/UPDATE)插入或更新数据库记录,则必须在SQL命令中使用SQL参数,然后可以将流加载到表示图像字段的参数中:

代码语言:javascript
复制
///Sample SQL Command:

INSERT INTO My_Table_Name
(MyField1, MyField2) 
VALUES (:prmMyField1, :prmMyField2)


/// Sending INSERT command to DB server

var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
     // Save some random data into the first param
    ADOCommand1.Parameters.ParamByName('prmMyField1').Value := 1;
    // Save image stream into the second param
    ADOCommand1.Parameters.ParamByName('prmMyField2').LoadFromStream(AStream);
    ADOCommand1.Execute;
  finally
    AStream.Free;
  end;
end;
票数 12
EN

Stack Overflow用户

发布于 2010-11-17 16:37:43

您是否将图像本身存储在MySQL中?你为什么要这么做?在这方面做了几个基准测试,得出的结论是这种做法是不可扩展的。

更好的做法是在磁盘上维护所有图像&有一个表,其中包含指向所有图像的链接。

在Google上简单查询- 'mysql图片商店‘或'mysql图片商店基准’就能给你找到合适的链接。

票数 2
EN

Stack Overflow用户

发布于 2010-11-17 16:32:45

也许这对你有帮助:

http://www.scalabium.com/faq/dct0065.htm -将组件保存到流中

然后将流保存到MySql

http://www.devarticles.com/c/a/Delphi-Kylix/Saving-Images-and-Binary-Files-to-a-Database-with-Delphi-2/

和http://en.allexperts.com/q/Delphi-1595/2008/7/Save-big-file-Mysql.htm

希望这就是你想要的,我完全理解你的要求。

诚挚的问候,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4201210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档