Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение картинки в файл и последущая ее загрузка:)


Кирилл ©   (2005-02-13 16:09:00) 

Кирилл ©   (13.02.05 15:55)  
Уважаемые мастера! Помогите пожалуйста разобраться! Хочу чтобы картинка грузилась из файла, который не может быть просмотрен пользователем.
Вот код проги, создающей файл:

procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitMap;
f: file of TBitMap;
begin
OpenDialog1.Execute;
SaveDialog1.Execute;
bmp:=TBitMap.Create;
bmp.LoadFromFile(OpenDialog1.FileName);
AssignFile(f, SaveDialog1.FileName+'.tex');
Rewrite(f);
Write(f, bmp);
closefile(f);
end;

А вот код проги, читающей файл:

procedure TForm1.FormCreate(Sender: TObject);
var
bmp: TBitMap;
f: File of TBitMap;
begin
bmp:=TBitMap.Create;
AssignFile(f, 'C:\New\tex1.tex');
Reset(f);
Read(f, BMP);
CloseFile(f);
Image1.Canvas.Draw(0,0,BMP);
end;

Выделенная строка вызывает динамическую ошибку. Никак не пойму, в чём тут дело?

--------------------------------------------------------------------------------
Kerk ©   (13.02.05 15:59) [1]
А хочешь угадаю сколько байт файл занимает? Четыре? :)

--------------------------------------------------------------------------------
begin...end ©   (13.02.05 16:00) [2]
> Кирилл ©   (13.02.05 15:55)

Проблема, по-видимому, в том, что в файле находится не изображение, как хотелось бы Вам, а указатель на экземпляр TBitmap. Посмотрите на размер используемого Вами файла - вероятно, его размер составляет 4 байта. Вряд ли изображение в формате BMP может занимать такой маленький объём, не правда ли? :-)

Используйте методы TBitmap.SaveToFile и TBitmap.LoadFromFile.


PZ   (2005-02-13 17:33:00) [1]

Все очень просто. По крайней мере, не очень опытный мастер не догадается:

procedure TForm1.Button1Click(Sender: TObject);
Var
 F1, F2 : File of byte;
 B : Byte;
begin
 If OpenDialog1.Execute then
 begin
   AssignFile(F1, OpenDialog1.FileName);
   AssignFile(F2, 'Proba.txt');
   Reset(F1);
   ReWrite(F2);
   Read(F1, B);
   Read(F1, B);
   While not EOF(F1) do
     begin
       Application.ProcessMessages;
       Read(F1, B);
       Write(F2, B);
     end;
   CloseFile(F2);
   CloseFile(F1);
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
 F1, F2 : File of byte;
 B : Byte;
begin
 If OpenDialog1.Execute then
 begin
   AssignFile(F1, 'Proba.txt');
   AssignFile(F2, 'Proba.bmp');
   Reset(F1);
   ReWrite(F2);
   B := $42;
   Write(F2, B);
   B := $4D;
   Write(F2, B);
   While not EOF(F1) do
     begin
       Application.ProcessMessages;
       Read(F1, B);
       Write(F2, B);
     end;
   CloseFile(F2);
   CloseFile(F1);
 end;
end;


Юрий Зотов   (2005-02-13 17:02:00) [2]

Используем модуль Zlib и храним на диске файл в сжатом виде. Если нужен дополнительный уровень защиты, то еще и шифруем поток.


Кирилл   (2005-02-13 17:01:00) [3]


> olookin ©   (13.02.05 16:47) [13]

Всё работает. Большое спасибо!


olookin   (2005-02-13 16:47:00) [4]

[11] begin...end ©   (13.02.05 16:38)

Да уж... Вообще этот мой код работать не будет.

Вот этот будет:

procedure TForm1.Button1Click(Sender: TObject);
var b: TBitmap;
  s: string;
  f: TFileStream;
  c: Char;
begin
b:=TBitmap.Create;
b.Width:=10;
b.Height:=10;
b.Canvas.Brush.Color:=clRed;
b.Canvas.FillRect(Rect(0,0,10,10));
s:='C:\newfile.bmp';
b.SaveToFile(s);
f:=TFileStream.Create(s,fmOpenReadWrite);
f.Position:=0;
c:='A'; //все bmp файлы начинаются с символа B, портим его на А
f.Write(c,SizeOf(Char));
f.Free;
//попробуем открыть файл с помощью Paint - получаем шиш
end;

procedure TForm1.Button2Click(Sender: TObject);
var b: TBitmap;
  s: string;
  f: TFileStream;
  c: Char;
begin
b:=TBitmap.Create;
s:='C:\newfile.bmp';
f:=TFileStream.Create(s,fmOpenReadWrite);
f.Position:=0;
c:='B'; //восстанавливаем символ
f.Write(c,SizeOf(Char));
f.Free;
b.LoadFromFile(s);
//попробуем открыть файл с помощью Paint - получаем что можно
end;


Кирилл   (2005-02-13 16:41:00) [5]


> olookin ©   (13.02.05 16:30) [10]

А как грузить?


begin...end   (2005-02-13 16:38:00) [6]

> olookin ©   (13.02.05 16:30) [10]

> c: Char;
> ...
> f.Write(c,SizeOf( integer));

?

И, плюс к этому, ведь содержимое файла будет испорчено?


olookin   (2005-02-13 16:30:00) [7]

procedure TForm1.Button1Click(Sender: TObject);
var b: TBitmap;
   s: string;
   f: TFileStream;
   c: Char;
begin
 b:=TBitmap.Create;
 b.Width:=10;
 b.Height:=10;
 b.Canvas.Brush.Color:=clRed;
 b.Canvas.FillRect(Rect(0,0,10,10));
 s:='C:\newfile.bmp';
 b.SaveToFile(s);
 f:=TFileStream.Create(s,fmOpenReadWrite);
 f.Write(c,SizeOf(integer));
 f.Free;
 RenameFile(s,'C:\newfile.tex');
end;


Кирилл   (2005-02-13 16:27:00) [8]


> Смотря от каких пользователей нужна защита. Для некоторых
> достаточно поменять расширение у файла.

Знаю, но к сожалению мне этого не достаточно


Кирилл   (2005-02-13 16:24:00) [9]


> сохранять в поток, шифровать, а потом на диск.


А код можно?


begin...end   (2005-02-13 16:24:00) [10]

> Кирилл ©   (13.02.05 16:22) [6]

Смотря от каких пользователей нужна защита. Для некоторых достаточно поменять расширение у файла.


begin...end   (2005-02-13 16:22:00) [11]

> Kerk ©   (13.02.05 16:20) [4]
> а у TBitmap SaveToStream / LoadFromStream есть?

Есть.


Кирилл   (2005-02-13 16:22:00) [12]


> begin...end ©   (13.02.05 16:18) [3]

А мне нужен файл, например с расширением *.tex или просто "file", который содержит bitmap, но который нельзя открыть с помощью например Paint'а


Kerk   (2005-02-13 16:20:00) [13]

а у TBitmap SaveToStream / LoadFromStream есть? не помню.. тогда сохранять в поток, шифровать, а потом на диск.


begin...end   (2005-02-13 16:18:00) [14]

> Кирилл ©   (13.02.05 16:10) [1]

> Но тогда получится файл .bmp !

А Вам какой нужен?


Кирилл   (2005-02-13 16:10:00) [15]


> TBitmap.SaveToFile и TBitmap.LoadFromFile.

Но тогда получится файл .bmp !


olookin   (2005-02-13 16:10:00) [16]

begin...end ©   (13.02.05 16:00) [2]
>>Используйте методы TBitmap.SaveToFile и TBitmap.LoadFromFile.

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо