Преобразуйте файл изображения в строку Base64 с помощью инструмента, подобного this , а затем замените заполнитель YourBase64StringHere
в приведенном ниже фрагменте вашей строкой и поместите строку в раздел заголовка HTML:
Это будет работать на 100% в браузерах.
AStream объявлен как параметр OUT, что означает, что он не назначается в начале процедуры, и процедура отвечает за присвоение ему правильного значения .
Если я правильно интерпретирую ваш код, вам следует опустить OUT и убедиться, что AStream создается правильно при вызове подпрограммы.
Еще один код, показывающий вызов StringToStream, может дать еще несколько подсказок.
CopyFrom вызывает ReadBuffer, который вызывает Read, а Read объявляется абстрактным. Какой поток вы передаете в AStream? Если он не реализует Read, вы получите абстрактную ошибку. (И компилятор должен выдать вам предупреждение, когда вы создадите его экземпляр.)
Объявление AStream как out мне кажется неправильным. Попробуйте удалить выход.
Если это не поможет, вот функция, которую я использую:
procedure StringToStream(Stream: TStream;const S: String);
begin
Stream.Write(Pointer(S)^, length(S));
end;
Следующая процедура должна сделать именно то, что вы ищете. Обратите внимание, что использование AStream отвечает за освобождение экземпляра, созданного в этой процедуре. Совершенно нормально вернуть родительский класс (в данном случае tStream), а не конкретный потомок.
procedure StringToStream(const AString: string; out AStream: TStream);
begin
AStream := TStringStream.Create(AString);
end;
Вы также можете закодировать это как функцию:
Function StringToStream(const AString: string): TStream;
begin
Result := TStringStream.Create(AString);
end;