Главная страница
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.053 c
11-1121198903
Serg777
2005-07-13 00:08
2006.03.12
DateTime2SystemTime Неправильно работает


2-1140881753
13
2006-02-25 18:35
2006.03.12
иконки в DLL


2-1140788428
Golik
2006-02-24 16:40
2006.03.12
Сортировка в DBGride ??


11-1121017425
Serg777
2005-07-10 21:43
2006.03.12
WS_POPUP и ListBox = постоянная перерисовка


10-1114366435
ink
2005-04-24 22:13
2006.03.12
Как в TWebBrowser поменять путь загрузки рисунка.