Консультация № 54635
07.09.2006, 14:29
0.00 руб.
0 7 1
Доброго дня. Есть мальнький вопросик. Как создать файл в своем формате для хранения уменьшенный изображений (thumbnails) и потом прочитать и отбразить. Хотелось бы с примером (особенно для чтения) или ссылку где про это можно почитать.

Обсуждение

Неизвестный
07.09.2006, 18:07
общий
это ответ
Здравствуйте, CjJoker!
То, что Вы называете уменьшенными копиями изображений, на самом деле
являются изображениями нормальных размеров. Просто они выводятся в
компонент TImage со свойством Stretch:= true.
Самый простой способ - хранить их в директории программы и сделать
для них отдельную директорию

uses
..., jpeg, ...;

var
PictureDir: string;
...

procedure TForm1.FormCreate(Sender: TObject);
begin
PictureDir:= GetCurrentDir + ‘\Pictures\‘;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Image1.Picture.LoadFromFile(SkinDir + ‘picture1.jpg‘);
end;
Неизвестный
09.09.2006, 20:25
общий
Савенко Вадим Иванович, вы уверены, что CjJoker хотел именно этого? Ведь уменьшенные копии читаются гораздо быстрее, особенно, если файлы большие, да еще и на распаковывание сжатия надо какое-то время потратить.
Неизвестный
10.09.2006, 10:59
общий
Сухомлин Кирилл Владимирович : вы целиком правы, цель состоит именно ("СОЗДАТЬ ФАЙЛ С ИЗОБРАЖЕНИЯМИ" - thumbnils - это для примера ), в реале необходимо в базе по ID картинки выводить предварительный просмотр в Grid-ах, наиболее часто используемые. Если кого-то ввел в заблуждение своим вопросом, прошу прощение.
Неизвестный
11.09.2006, 22:31
общий
1) Создать файл - я думаю, очевидно как.2) Просканировать папку или чего-дь еще на предмет наличия изображений. Организовать массив. для имен файлов (или какие-дь ID, если данные хранятся в базе, а не в файловой системе).3) Определить пару типов. Например так:type TPreviewImage = class(TBitMap) public constructor Create(path: string = ‘‘); end; const PREVIEW_SIZE = 32*32*3; // Width x Height x bpp// ...constructor TPreviewImage.Create(path: string = ‘‘);var bmp: TBitMap;begin inherited Create; Width := 32; Height := 32; PixelFormat := pf24bit; if (path <> ‘‘) then begin bmp := TBitMap.Create; bmp.LoadFromFile(path); Canvas.CopyRect(Canvas.ClipRect, bmp.Canvas, bmp.Canvas.ClipRect); end;end;Далее хорошо бы отсортировать это по строкам, перевести их в TStringList (назовем его path) и сохранить в один файл.4) Сохраняете образы в бинарный файлvar img: TPreviewImage fs: TFileStream; fs := TFileStream.Create("file_name", fmCreate); for i := 0 to path.Count-1 do begin img := TPreviewImage.Create(path[i]); fs.Write(img.ScanLine[0]^, PREVIEW_SIZE); end; fs.Free;end;Это все по созданию.В принципе, это можно объединить в один файл, но тогда будет не так удобно загружать назад в TStringList. Когда загрузите, в TStringList, выставьте свойство Sorted в True - будет быстро работать метод IndexOf. Если, конечно, вы до этого сортировали массив.Делаете fs.Seek(path.IndexOf(name)*PREVIEW_SIZE, soFromBeginning);И читаете с помощью fs.Read(img.ScanLine[0]^, PREVIEW_SIZE); прям в заранее подготовленную переменную типа TBitMap или даже лучше TPreviewImage. Куда ее дальше рисовать - сами разберетесь
Неизвестный
12.09.2006, 09:51
общий
fs.Write(img.ScanLine[0]^, PREVIEW_SIZE); >> Большое спасибо, вот в чем дело. Если можно расскажите о ScanLine по подробней. И если можно с примером использования c BlockRead.
Неизвестный
12.09.2006, 19:21
общий
Честно не знаю, что такое BlockRead - только догдадки какие-то есть. Про ScanLine более подробно, чем написано в хелпе я вам вряд ли чего-дь расскажу.
Неизвестный
13.09.2006, 09:59
общий
Сухомлин Кирилл Владимирович >> Все равно спасибо, теперь думаю разберусь!!!! :)
Форма ответа