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

Вниз

Как записать несколько картинок в один .dat файл   Найти похожие ветки 

 
VS   (2001-09-27 07:12) [0]

Как можно записать несколько картинок в один файл структуры .dat
и потом читать эти картинки (например для использования фонов в
своей программе, что-бы не хранить их в .exe)


 
Digitman ©   (2001-09-27 09:01) [1]

например, так :
FileStream := TFileStream.Create("mybitmaps.dat", fmCreate);
try
Bitmap1.SaveToStream(FileStream);
Bitmap2.SaveToStream(FileStream);
// и т.д.
finally
FileStream.Free;
end;


 
VS   (2001-09-28 08:48) [2]

А как читать из этого файла. Например, нужно открыть одну
картинку из этого файла с номером таким то и поместить как фон
рабочего стола


 
Digitman ©   (2001-09-28 12:50) [3]

запись в поток индексированного списка битмапов

var
FileStream: TFileStream;
bmplist: TComponentList; //список битмапов, записываемых в поток
bmplistcount: Integer; //число битмапов в списке
offslist: TList; //список смещений битмапов в потоке
i: Integer;

.....
готовим здесь объекты-битмапы,
создаем экземпляр bmplist
и ссылки на экземпляры битмапов записываем в bmplist в нужном порядке следования
......

bmplistcount := bmplist.Count; // общее число битмапов, подлежащих сохранению

FileStream := TFileStream.Create("mybitmaps.dat", fmCreate);
offslist := TList.Create;

try

//резерв места в потоке под заголовок
FileStream.Size := SizeOf(bmplistcount) + SizeOf(Integer)*bmplistcount;
FileStream.Position := FileStream.Size; // в конец заголовка
//емкость списка смещений
offslist.Capacity := bmplistcount;

for i:= 0 to bmplistcount - 1 do
//сохранение смещения битмапа в потоке в список смещений
offslist.Items[i] := Pointer(FileStream.Position);
//сохранение в поток i-го битмапа
TBitmap(bmplist.Items[i]).SaveToStream(FileStream);

with FileStream do begin
Position := 0;
Write(bmplistcount, SizeOf(bmplistcount)); //сохранение числа битмапов
Write(offslist.List^, SizeOf(Integer)*bmplistcount); //сохранение списка смещений
end;
finally
offslist.Free;
FileStream.Free;
end;
....


чтение из потока битмапа по его порядковому номеру в списке сохраненных

function GetBitmapFromFile(const FileName: String; const bmpidx: Integer): TBitmap;
var
FileStream: TFileStream;
i: Integer;
begin
Result := TBitmap.Create;
try
FileStream := TFileStream.Create("mybitmaps.dat", fmOpenRead);
try
FileStream.Read(i, SizeOf(i));//общ.число битмапов в потоке
if bmpidx < i then begin
FileStream.Position := (i+1)*SizeOf(Integer);
FileStream.Read(i, SizeOf(i));//смещение нужного битмапа в потоке
FileStream.Position := i;
Result.LoadFromStream(FileStream);
end else
raise Exception.Create("BmpIndex out of bound");
finally
FileStream.Free;
end;
except
Result.Free;
raise;
end;
end;

примерно так. до ума доводи сам.



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

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

Наверх




Память: 0.47 MB
Время: 0.006 c
3-28411
dva
2001-12-08 00:27
2002.01.10
Vopros


6-28518
Sregey
2001-10-17 14:13
2002.01.10
О ServerWinSocket


3-28416
Atrem
2001-11-30 19:35
2002.01.10
BLOB поля


3-28434
Dreamer
2001-12-08 14:31
2002.01.10
Есть процедура инициированная DataSource как ее вызвать


3-28426
Yu
2001-12-07 13:30
2002.01.10
DBLookUpComboBox