Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.12;
Скачать: CL | DM;

Вниз

TMemoryStream   Найти похожие ветки 

 
BigLoy   (2006-02-22 11:40) [0]

Не получается записать в 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 ...
Задача, последовательно доставать из файла эти изображения ...
Чем можно мне помочь? Спасибо


 
Alkid ©   (2006-02-22 11:45) [1]

А не проще ли сделать TFileStream, с его помощтю открыть файл и читать
приямо из него картинки?


 
MBo ©   (2006-02-22 11:47) [2]

MyJpeg.LoadFromStream встает в начало потока и читает всё, что есть.
Таки образом, нужно скопировать кусок в дополнительный поток CopyFrom, а оттуда уже загружать JPEG


 
Alarm ©   (2006-02-22 12:00) [3]

>Alkid ©   (22.02.06 11:45) [1]
не проще, контейнер формируется из блоб полей динамически
>MBo ©   (22.02.06 11:47) [2]
Спасибо, попытаюсь ...


 
Johnmen ©   (2006-02-22 12:02) [4]

...
AssignFile(F, "PictureContayner.dat");
...
ms.SetSize(MCount);
BlockRead(F, ms, MCount);
...


 
Alkid ©   (2006-02-22 12:21) [5]


> ...
> AssignFile(F, "PictureContayner.dat");
> ...
> ms.SetSize(MCount);
> BlockRead(F, ms, MCount);
> ...

Боюсь так ты просто испортишь экземплярTMemoryStream


 
MBo ©   (2006-02-22 12:21) [6]

>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:28) [7]


> Alkid ©   (22.02.06 12:21) [5]
> Боюсь так ты просто испортишь экземплярTMemoryStream


Я не боюсь...:)

>MBo ©   (22.02.06 12:21) [6]
>...использовать Pointer(ms.Memory)^

Зачем приводить к поинтеру, если он уже поинтер? :)
И, кстати, нет, так нельзя...


 
Johnmen ©   (2006-02-22 12:33) [8]


> >MBo ©   (22.02.06 12:21) [6]
> >...использовать Pointer(ms.Memory)^
> И, кстати, нет, так нельзя...


Можно :) ms.Memory^


 
MBo ©   (2006-02-22 12:42) [9]

>Johnmen
верно, приводить к Pointer не нужно



Страницы: 1 вся ветка

Текущий архив: 2006.03.12;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
2-1140182099
konda
2006-02-17 16:14
2006.03.12
FireBird


15-1140426523
tigra
2006-02-20 12:08
2006.03.12
DBF Viewer 2000 v2.02


11-1111965539
Stals
2005-03-28 03:18
2006.03.12
Пример добавления строк с различным форматированием в RichEdit...


4-1135118283
Delphi_is_cool
2005-12-21 01:38
2006.03.12
Как добавить строку


2-1140437290
Creative
2006-02-20 15:08
2006.03.12
LoadFromFile