Главная страница
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.48 MB
Время: 0.006 c
1-28484
Русский
2001-12-21 21:54
2002.01.10
New заморочка от Русского ;)


6-28522
Serguar
2001-10-09 11:01
2002.01.10
Как отследить событие <reset> компьютера на котором висит подконнекченый к серверу клиент


1-28473
dimonf
2001-12-21 21:02
2002.01.10
Вопрос по MDI форме


3-28427
Polar Bear
2001-12-07 18:16
2002.01.10
Загрузка-выгрузка Interbase (local) вместе с программой


1-28498
Dimedrol
2001-12-22 13:30
2002.01.10
DLL вызывает процедуру в основной проге...