Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2008, 16:17   #1
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию запись битмапа в файл

Люди, подскажыте как записать массив битмапов в один типизированный или не типизированный файл посредством потоков или иным методом, с возможностью чтения данного файла и востановления битмапов. Рад любой помощи. Спасибо за внимание.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 07.06.2008, 17:43   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

В приложении исходник, 2 битмапа с известным весом записываются в один файл, а потом их можно записать в разные файлы.
Вложения
Тип файла: rar Новая папка.rar (6.7 Кб, 25 просмотров)
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 07.06.2008, 21:48   #3
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Спасибо буду разбираться. Жду еще предложений.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 07.06.2008, 22:23   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Например поблочно записывать, друг за другом файлы с указанием размера для чтения.
1-ый) размер файла(Cardinal или LongInt), блоками пишем файл;
2-ой)....

Незабывая сдвигать позицию в файле(если потребность в этом есть).

размер|Файл-тело|размер|Файл-тело|.....
Alter вне форума Ответить с цитированием
Старый 07.06.2008, 23:04   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Или сделать заголовок определенного размера, например 128 байт. В нем кол-во вложенных файлов, их размеры и позиции. Программа читает заголовок, и потом читает в поток с нужных позиций нужное кол-во.
Во избежание ошибок, в первых байтах загловка можно сделать идентификатор, что это твой файл, иначе не читать его.

Принцип все тот же что и выше написали.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.06.2008, 23:12   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Если массив битмапов это array of TBitMap, то объект TBitMap может писать себя сам:

Код:
procedure TForm1.FormCreate(Sender: TObject);
var B : array [1..2] of TBitMap;
    F:TFileStream;
    C, i:integer;
begin
   // Создание массива для теста
   B[1] := TBitMap.Create;
   B[1].loadFromFile('1.bmp');
   B[2] := TBitMap.Create;
   B[2].loadFromFile('2.bmp');

   // Запись массива в файл
   F := TFileStream.Create('test.dat', fmCreate);
   try
      C := high(B)-low(B)+1;
      F.write(C, sizeOf(integer));
      for i:=low(B) to high(B) do begin
         B[i].SaveToStream(F);
      end;
   finally
      F.free;
   end;

   B[1].free;
   B[2].free;

   // Чтение из файла
   F := TFileStream.Create('test.dat', fmOpenRead);
   try
      F.read(C, sizeOf(integer));
      for i:=1 to C do begin
         B[i] := TBitMap.Create;
         B[i].LoadFromStream(F);
      end;
   finally
      F.free;
   end;

   image1.Picture.Assign(B[2]);

   B[1].free;
   B[2].free;
end;
alexBlack вне форума Ответить с цитированием
Старый 07.06.2008, 23:16   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Делюсь своим исходником, здесь запись 12-ти Jpeg файлов, каждый с коротким пояснением (string[30]) и расширенным описанием (string[150]) в один файл - контейнер.
Код:
//******************************************************************//

//compile and write to file (compile в смысле собрать в кучу, а не компиляция)
//иногда лень раскладку переключать, пишу камменты на инглише )
{ Cтруктура файла
0-95 (96) - данные о размерах и расположении jpeg файлов
96-467 (372) - заголовки (по одному байту на строку лишние)
468-2279 (1812) - пояснения

Первые 96 байт
Размер[0] 4 байта
Позиция[0] 4 байта
...
Размер[11] 4 байта
Позиция[11] 4 байта
}
procedure TForm1.Button8Click(Sender: TObject);
const
Path = 'TestImages/';
var
IntBuffer: array[0..23] of integer;
StrBuffer1: array[0..11] of string[30];
StrBuffer2: array[0..11] of string[150];
i: integer;
f: file of Byte;
tf: TextFile;
size: Longint;
sizes: array[0..11] of Longint;
s: string;
fs, fst: TFileStream;
begin
//заполнение IntBuffer
for i:=0 to 11 do
  begin
  AssignFile(f, Path + IntToStr(i)+'.jpg');
  Reset(f);
  size := FileSize(f);
  //размер
  IntBuffer[i*2]:=size;
  //позиция
  if i = 0 then IntBuffer[1]:=2280 //с 2280 байта начинаются jpeg данные
  else IntBuffer[i*2+1]:=IntBuffer[i*2-1]+IntBuffer[(i-1)*2];
  //sizes[i]:=size;
  CloseFile(f);
  end;
//for i:=0 to 11 do s:=s+'Size '+IntToStr(IntBuffer[i*2])+'  Position '+ IntToStr(IntBuffer[i*2+1])+#13;
//ShowMessage(s);

//заполнение StrBuffer1
AssignFile(tf,Path+'Strings1.txt');
Reset(tf);
for i:=0 to 11 do
  begin
  ReadLn(tf,StrBuffer1[i]);
  end;
CloseFile(tf);

//заполнение StrBuffer2
AssignFile(tf,Path+'Strings2.txt');
Reset(tf);
for i:=0 to 11 do
  begin
  ReadLn(tf,StrBuffer2[i]);
  end;
CloseFile(tf);

fs:=TFileStream.Create(Path+'Test.dat',fmCreate);
fs.Write(IntBuffer,96);
fs.Write(StrBuffer1,372);
fs.Write(StrBuffer2,1812);
//ShowMessage(IntToStr(fs.Write(StrBuffer1,SizeOf(StrBuffer1))));
for i:=0 to 11 do
  begin
  fst:=TFileStream.Create(Path + IntToStr(i)+'.jpg', fmOpenRead);
  fs.CopyFrom(fst,0);
  fst.Free;
  end;
fs.Free;
end;

//чтение из файла-контейнера
procedure TForm1.Button9Click(Sender: TObject);
const
Path = 'TestImages/';
var
IntBuffer: array[0..23] of integer;
StrBuffer1: array[0..11] of string[30];
StrBuffer2: array[0..11] of string[150];
i: integer;
f: file of Byte;
tf: TextFile;
size: Longint;
sizes: array[0..11] of Longint;
s: string;
fs, fst: TFileStream;
ms: TMemoryStream;
Images: array[0..11] of TJpegImage;
begin
fs:=TFileStream.Create(Path+'Test.dat',fmOpenRead);
fs.Read(IntBuffer,96);
fs.Read(StrBuffer1,372);
fs.Read(StrBuffer2,1812);
//извлечение картинок
for i:=0 to 11 do
  begin
  ms:=TMemoryStream.Create;
  Images[i]:=TJpegImage.Create;
  fs.Position:=IntBuffer[i*2+1];
  ms.CopyFrom(fs,IntBuffer[i*2]);
  ms.Position:=0;
  Images[i].LoadFromStream(ms);
  ms.Free;
  end;
fs.Free;
canvas.Draw(0,0,Images[7]);
//извлечение строк
s:='';
for i:=0 to 11 do
  s:=s + StrBuffer1[i] + ' ' + StrBuffer2[i] + #13;
ShowMessage(s);
end;

//******************************************************************//
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.06.2008, 23:53   #8
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Всем огромное спасибо, коллеги, материала накопилось достаточно.
З.Ы. Хорошо что существуют коммуникации.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 09.06.2008, 08:56   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я может не к месту но БД для этого самое оно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в файл |{ot Общие вопросы Delphi 6 05.07.2008 02:24
Запись в файл [Smarik] Помощь студентам 4 07.05.2008 23:26
Запись в файл С++ Viteks Общие вопросы C/C++ 3 18.04.2008 13:18
запись в файл Prisian Общие вопросы Delphi 6 24.07.2007 13:43