【问题标题】:Get image from web and display using Synapse从 Web 获取图像并使用 Synapse 显示
【发布时间】:2014-03-19 12:28:04
【问题描述】:

我想将网络上的图像导入流(不保存)并将其显示在 TImage 上。 以下代码产生错误:

response := TMemoryStream.Create;
try
   HttpGetBinary('http://www.example-url/example_image.jpg', response);
   Image.Picture.LoadFromStream(response);
finally
   response.Free;
end;

项目 ------- 引发异常类 'EReadError' 并带有消息: 流读取错误

这是错误指向的 Synapse 库(在 picture.inc 中)中的函数:

function TPicFileFormatsList.FindByStreamFormat(Stream: TStream): TGraphicClass;
var
  I: Integer;
begin
  for I := Count - 1 downto 0 do
  begin
    Result := GetFormats(I)^.GraphicClass;
    if Result.IsStreamFormatSupported(Stream) then   // <<<<<< this is the error line
      Exit;
  end;
  Result := nil;
end;

【问题讨论】:

  • 将流位置设置为开头,然后再将其加载到图像中。喜欢response.Position := 0; Image.Picture.LoadFromStream...
  • 我在发帖之前试过了。结果是一样的。

标签: delphi lazarus synapse fpc


【解决方案1】:

您必须在项目中的某处包含 JPEGLib 单元,以便注册 JPEG 图形类。

uses
  JPEGLib, // to support JPEG
  PNGcomn, // to support PNG
  httpsend;

response := TMemoryStream.Create;
try
   if HttpGetBinary('http://www.example-url/example_image.jpg', response) then
   begin
     response.Seek( 0, soFromBeginning );
     Image.Picture.LoadFromStream( response );
   end;
finally
   response.Free;
end;

【讨论】:

  • 我没有手动FPC,但我认为如果TImage.PictureLoadFromStream 方法,应该有机会直接从流中加载它。这是 TPicFileFormatsList.FindByStreamFormat 方法失败了,所以问题是(除了重置流位置)在注册 JPEG 格式的丢失单元中吗?这只是一个疯狂的猜测......
  • +1 @TLama 你完全正确...... FPC 在这一点上与 Delphi 不同 :o)
  • 这行得通。 JPEGLib 和 PNGcomn 不是必需的,调试器会显示它们没有在我的单元中使用的消息。我应该提到我使用 FPC 而不是 Delphi :)。谢谢。
  • 好的,唯一的问题是您没有重置流位置?你告诉我你试过了,你得到了同样的结果......
  • 这:response.Position := 0 不起作用。这: response.Seek(0, soFromBeginning) 有效。不知道...我承认我对流并不熟悉。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多