![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TMemoryStream
BigLoy © (2006-02-22 11:40:00)Не получается записать в MemoryStream определенную часть файла:
var ms: TMemoryStream;
F: file;
MCount: LongInt;
MyJpeg: TJpegImage;
Image1: TImage;
...
ms:= TMemoryStream.Create;
MyJpeg:= TJpegImage.Create;
Assign(F, 'PictureContayner.dat');
Reset(F, 1);
BlockRead(F, MCount, SizeOf(MCount));
//ну, а здесь мне необходимо в ms прочитать/записать MCount байтов
.....
//и далее желательно
MyJpeg.LoadFromStream(ms);
Image1.Picture.Assign(MyJpeg);
Close(F);
В PictureContayner.dat, сохранены Jpeg в формате: размер Jpeg, сам Jpeg, размер Jpeg, сам Jpeg ...
Задача, последовательно доставать из файла эти изображения ...
Чем можно мне помочь? Спасибо
MBo (2006-02-22 12:42:00) [1]>Johnmen
верно, приводить к Pointer не нужно
Johnmen (2006-02-22 12:33:00) [2]
> >MBo © (22.02.06 12:21) [6]
> >...использовать Pointer(ms.Memory)^
> И, кстати, нет, так нельзя...
Можно :) ms.Memory^
Johnmen (2006-02-22 12:28:00) [3]
> Alkid © (22.02.06 12:21) [5]
> Боюсь так ты просто испортишь экземплярTMemoryStream
Я не боюсь...:)
>MBo © (22.02.06 12:21) [6]
>...использовать Pointer(ms.Memory)^
Зачем приводить к поинтеру, если он уже поинтер? :)
И, кстати, нет, так нельзя...
Alkid (2006-02-22 12:21:00) [4]
> ...
> AssignFile(F, 'PictureContayner.dat');
> ...
> ms.SetSize(MCount);
> BlockRead(F, ms, MCount);
> ...
Боюсь так ты просто испортишь экземплярTMemoryStream
MBo (2006-02-22 12:21:00) [5]>MyJpeg.LoadFromStream встает в начало потока
Это я соврал, нужно самому вставать в начало
procedure TForm3.Button3Click(Sender: TObject);
var
fs:TFileStream;
jp:TJpegImage;
ms:TMemoryStream;
Sz: Integer;
begin
//запись
fs:=TFileStream.Create('D:\data.dat',fmCreate);
jp:=TjpegImage.Create;
jp.LoadFromFile('d:\b.jpg');
ms:=TMemoryStream.Create;
jp.SaveToStream(ms);
Sz:=ms.Size;
fs.Write(Sz,SizeOf(Sz));
ms.Position:=0;
fs.CopyFrom(ms,sz);
fs.Free;
//чтение
fs:=TFileStream.Create('D:\data.dat',fmOpenRead);
fs.Read(Sz,SizeOf(Sz));
ms.Clear;
ms.CopyFrom(fs,Sz);
ms.Position:=0;
jp.LoadFromStream(ms);
Canvas.Draw(0,0,jp);
fs.Free;
ms.Free;
jp.Free;
end;
А если есть желание читать в ms из файла BlockRead, придется использовать Pointer(ms.Memory)^ c предварительным SetSize
Johnmen (2006-02-22 12:02:00) [6]
...
Assign File(F, 'PictureContayner.dat');
...
ms.SetSize(MCount);
BlockRead(F, ms, MCount);
...
Alarm (2006-02-22 12:00:00) [7]>Alkid © (22.02.06 11:45) [1]
не проще, контейнер формируется из блоб полей динамически
>MBo © (22.02.06 11:47) [2]
Спасибо, попытаюсь ...
MBo (2006-02-22 11:47:00) [8]MyJpeg.LoadFromStream встает в начало потока и читает всё, что есть.
Таки образом, нужно скопировать кусок в дополнительный поток CopyFrom, а оттуда уже загружать JPEG
Alkid (2006-02-22 11:45:00) [9]А не проще ли сделать TFileStream, с его помощтю открыть файл и читать
приямо из него картинки?