![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение картинки в файл и последущая ее загрузка:)
Кирилл © (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.
Если этим ограничиться, тогда как раз и можно будет просмотреть файл.