【问题标题】:LoadFromStream doesn't appear to work in Delphi 5LoadFromStream 在 Delphi 5 中似乎不起作用
【发布时间】:2018-10-26 12:43:03
【问题描述】:

我正在使用 Delphi 5 Enterprise,因为这是我正在使用的程序编写的。我编写了一个程序,可以非常愉快地将位图保存到 Access 数据库中。现在我希望能够检索位图。保存位图,我使用 SaveToStream。检索它们时,我使用了 LoadFromStream 但编译器告诉我它无法识别该函数。代码如下:

 procedure TForm1.Button2Click(Sender: TObject);
 var
    Field : TBlobField;
    Stream : TStream;
    BMap : TBitMapImage;
 begin
   if BloBQuery.Active then
      begin
         Field := TBlobField(BlobQuery.FieldByName('Blob'));
         Stream := BlobQuery.CreateBlobStream(Field, bmRead);
         BMap := TBitMapImage.Create;
      try
         Image2.Picture.Graphic := BMap.LoadFromStream(Stream);
      finally
         BMap.Free;
         Stream.Free;
      end;
   end;
end;

谁能告诉我 LoadFromStream 什么时候不起作用?好像很奇怪!谢谢。

写位图的代码是:

    procedure TForm1.Button1Click(Sender: TObject);
var
  Field : TBlobField;
  Stream : TStream;
begin
   if (BlobQuery.Active = True) and (Image1.Picture.Graphic <> nil) then begin
       BlobQuery.Insert;
       Field := TBlobField(BlobQuery.FieldByName('Blob'));
       Stream := BlobQuery.CreateBlobStream(Field, bmWrite);
       try
          Image1.Picture.Graphic.SaveToStream(Stream);
       finally
          Stream.Free;
          BlobQuery.Post;
       end;
   end;
end;

【问题讨论】:

  • 编译器告诉您TBitmapImage 没有名为LoadFromStream 的方法。这是正确的。它也没有名为SaveToStream 的方法。所以我不确定你的代码在做什么来保存到流中,但它肯定不是在TBitmapImage 上调用SaveToStream。为了给您适当的帮助,我们希望看到保存图像的代码。您是在打电话给Graphic.SaveToStream,还是Graphic.Bitmap.SaveToStream,或者可能是别的什么?总是值得阅读错误消息。错误消息包含您似乎忽略的信息。
  • 以后,请在您的帖子中包含确切错误消息。
  • 您好,编译器错误是:[Error] Unit1.pas(70): Undeclared identifier: 'LoadFromStream'
  • 保存位图的代码是:procedure TForm1.Button1Click(Sender: TObject);变量字段:TBlobField;流:TStream;如果 (BlobQuery.Active = True) 和 (Image1.Picture.Graphic nil) 开始,则开始 BlobQuery.Insert;字段:= TBlobField(BlobQuery.FieldByName('Blob'));流 := BlobQuery.CreateBlobStream(Field, bmWrite);尝试 Image1.Picture.Graphic.SaveToStream(Stream);最后是 Stream.Free; BlobQuery.Post;结尾;结尾;结束;
  • 在我删除的答案的 cmets 中,您明确表示您对学习不感兴趣。我已经修复了我的答案,修复了原始版本中的缺陷。但我真的对这个过程没有更多的热情。

标签: delphi delphi-5


【解决方案1】:

假设Image1.Picture.Graphic 在您将其保存到数据库时指向TBitmap 对象,则在读取图像时需要使用TBitmap 对象而不是TBitMapImage 对象,例如:

procedure TForm1.Button2Click(Sender: TObject);
var
  Field : TBlobField;
  Stream : TStream;
  BMap : TBitmap;
begin
  if BlobQuery.Active then
  begin
    Field := TBlobField(BlobQuery.FieldByName('Blob'));
    Stream := BlobQuery.CreateBlobStream(Field, bmRead);
    try
      BMap := TBitmap.Create;
      try
        BMap.LoadFromStream(Stream);
        Image2.Picture.Graphic := BMap;
      finally
        BMap.Free;
      end;
    finally
      Stream.Free;
    end;
  end;
end;

或者:

procedure TForm1.Button2Click(Sender: TObject);
var
  Field : TBlobField;
  Stream : TStream;
begin
  if BlobQuery.Active then
  begin
    Field := TBlobField(BlobQuery.FieldByName('Blob'));
    Stream := BlobQuery.CreateBlobStream(Field, bmRead);
    try
      Image2.Picture.Bitmap.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
  end;
end;

【讨论】:

  • 谢谢雷米。我会在早上试试。非常感谢。
  • 雷米,谢谢。尽管第一种方法是我想要做的事情所需要的,但它们都可以工作。非常感激。我知道这很简单,位图。记住这一点!再次感谢。
  • @Capfka 再次阅读雷米的回答!不要依赖您的代码将始终将您的图像保存为位图,并且您以后可以使用 TBitmap 类加载它。例如,如果您将 JPG imate 加载到 TImage 组件,然后使用您的代码将该图像保存到数据库中,则该图像不会保存为位图而是保存为 JPEG 图像,然后您将需要使用 TJPEGImage 类进行加载它而不是 TBitmap。很好的方法是,您还可以将有关图像类型的信息保存到数据库中,然后在从数据库中加载图像时使用该信息。
  • 或者,至少查看存储的图像数据的前几个字节以确定图像类型。不同的图像类型具有唯一的签名字节
  • 其实还有一个更好的方法,我之前不记得了。那就是在保存时实际使用TImage.Picture.SaveToStrem f,在从流中加载图像时使用TImage.Picture.LoadFromStream。这样,加载例程会自动检查图像类型并为其创建所需的容器。使用 TPciture 或任何 TGraphic 后代docwiki.embarcadero.com/Libraries/Tokyo/en/… 的 SaveToStream 例程写入有关将哪种图像类型存储在流中的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2017-08-31
  • 2015-05-20
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多