Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c