2014-02-19 4 views
1

Я хочу получить изображение из Интернета в потоке (без сохранения) и отобразить его на TImage. Следующий код выдает ошибку:Получить изображение из Интернета и отображения с помощью Synapse

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; 
+0

Установите положение потока до начала, прежде чем загружать его в изображение. Как 'response.Position: = 0; Image.Picture.LoadFromStream ... ' – TLama

+0

Я пробовал это перед публикацией здесь. Результат тот же. – user3327194

ответ

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; 
+1

У меня нет FPC вручную, но я думаю, что если 'TImage.Picture' имеет метод LoadFromStream, то есть возможность загрузить его непосредственно из потока. Это метод 'TPicFileFormatsList.FindByStreamFormat', который терпит неудачу, поэтому проблема не была (кроме сброса позиции потока) в отсутствующем модуле, который регистрирует формат JPEG? Это просто дикая догадка ... – TLama

+1

+1 @TLama Вы совершенно правы ... FPC отличается в этом пункте от Delphi: o) –

+0

Это работает. JPEGLib и PNGcomn не нужны, отладчик сообщает, что они не используются в моем устройстве. Я должен был упомянуть, что я использую FPC, а не Delphi :). Спасибо. – user3327194