| 
| 
 | Вопрос # 597/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Подскажите, как решить проблему с созданием базы данных о "клиентах" с хранением рисунков JPEG, каждому клиенту персонально(до 10 рисунков, необходимо загружать, сохранять и удалять в БД), при этом обеспечить возможность просмотра всех его рисунков одновременно в виде маленьких рисункав(иконок), а также увеличивать при необходимости. Рисунки желательно в JPEG, но моно и в BMP.
 В общем сделать типа спец органайзера.
 Заранее спасибо за ответы.
 Буду рад любой мысле по энтой теме.
 
|  |   Вопрос задал: Илья Бабаков (статус: Посетитель)Вопрос отправлен: 24 мая 2007, 20:55
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Venom Здравствуйте, Илья Бабаков!Загрузка изображений:
 CDS1.Insert;
 MS:=TMemoryStream.Create;
 MS.LoadFromFile("имя файла");
 (CDS1.FieldByName('Pict') as TBlobField).LoadFromStream(MS);
 MS.Free;
 CDS1.Post;
 
 
 Чтение изображений - приведу процедуру целиком:
 //открытие изображений
 procedure TF_Main.MLoadPict(s:string;Img:TImage);
 var MS:TStream;
 jpg: TJPEGImage;
 Code: Word;
 ss:string;
 begin
 //создание потока
 MS:=CDS.CreateBlobStream(CDS.FieldByName('Pict'), bmRead);
 if MS.Size=0 then Exit;
 try
 MS.Read(Code, SizeOf(Code));
 MS.Seek(0, 0);
 //очищение TImage
 if Assigned(Img.Picture.Graphic) then
 Img.Picture.Graphic:=nil;
 Case Code of
 $4D42: //для картинки bmp
 begin
 Img.Picture.Graphic:=TBitmap.Create;
 Img.Picture.Graphic.LoadFromStream(MS);
 end;
 $D8FF: //для jpeg картинки
 begin
 Img.Picture.Graphic:=TJPEGImage.Create;
 Img.Picture.Graphic.LoadFromStream(MS);
 end;
 end;
 Img.Visible:=True;
 finally
 MS.Free;
 end;
 end;
 
 Загрузку изображения можно сделать в Image небольшого размера со свойством Scretch:=True, а потом масштабировать.
 На счет масштабирования тоже полностью процедурка. Писал её давно и не пользовался давно, поэтому, возможно, есть смысл её улучшить :)
 
 procedure TF_Main.Ranging(key:boolean);
 var Ds:integer;
 Scale:double;
 begin
 //коэф-т увеличения(Ds=1) или уменьшения изображения
 if key=true then Ds:=1
 else Ds:=-1;
 
 //изменение масштаба
 Scale:=StrToFloat(Pref_Form.ScaleEdit.Text)/100;
 Image1.Height:=Round(Image1.Height*(1+Ds*Scale));
 Image1.Width:=Round(Image1.Width*(1+Ds*Scale));
 //центрирование изображения
 ScrollBox1.HorzScrollBar.Position:=Round((Image1.Width-ScrollBox1.Width)/2);
 ScrollBox1.VertScrollBar.Position:=Round((Image1.Height-ScrollBox1.Height)/2);
 //соотнесение размеров холста и картинки
 PaintBox1.Top:=Image1.Top;
 PaintBox1.Left:=Image1.Left;
 PaintBox1.Width:=Image1.Width;
 PaintBox1.Height:=Image1.Height;
 end;
 
|  | Ответ отправил: Venom (статус: 1-ый класс)Время отправки: 25 мая 2007, 06:26
 
 |  Ответ #2. Отвечает эксперт: Косолапов Дмитрий Юрьевич Здравствуйте, Илья Бабаков!Мне кажется, что хранить картинки непосредственно в БД не самая удачная идея (хотя бы потому что ее размер становится очень большим), я бы посоветовал в БД хранить лишь ссылки на файлы картинок (наверное, в виде относительного пути по отношению к некоторому заданному каталогу для изображений), ну а дальше как обычно - Image1.Picture.LoadFromFile и т.д.
 Чтобы TImage понимали jpeg, необходимо подключить модуль jpeg, и зарегистрировать (для пущей важности) этот формат:
 Image1.Picture.RegisterFileFormat('.jpg','',TJPEGImage);
 
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 28 мая 2007, 07:20; участников в обсуждении: 2. 
|   | Илья Бабаков (статус: Посетитель), 25 мая 2007, 06:55 [#1]:Спасибо за внимание к моей проблеме. Если честно, я еще не волшебник, а только учусь.
 Не могли бы вы подробней описать предложенный вариант (Какая БД, как туды вставлять и тд.)
 Если не посчитаете нужным растилковать всё равно огромное спасибо (буду сам разбираться,просто жаль времени на изобретание пятого колеса).
 |  
|   | Илья Бабаков (статус: Посетитель), 25 мая 2007, 10:01 [#3]:Мне стало понятно , что ни чего не понятно. На скок я понял, моно попытаться добиться "истинны".
 Кажется, я просто не правильно начал объяснять суть своей проблемы (хотя в твоих ответах есть необходимые решения, но я не могу их применить, наверно старею или просто не догоняю что к чему).
 Начну с БД:
 Бд в Access, со следуюшими таблицами и полями:
 -Klient-
 ID_Klient-Счетчик
 Data Regist-Дата/время
 Fam-Текстовый.
 
 -Foto-
 Id_Foto-Счетчик
 ID_Link_Klient-Числовой(для связки с Klient)
 Мне необходимо чтобы была возможность загружать фото для каждого клиента.
 При выборе определенного клиента просматривать все фотографии в виде иконок(одновременно), при необходимости выбранную фотку просмотреть в истинном масштабе.
 А как добовлять фото клиенту воще не имею представление, да и воще- как просматривать(какие инструменты, как...),как в виде иконок, короче одни вопросы.
 Если тебя не затруднит, то каждый шаг.
 Огромное СПАСИБО за внимание.
 |  
|   | Илья Бабаков (статус: Посетитель), 25 мая 2007, 10:03 [#4]:Добавление к описанию -Foto- Id_Foto-Счетчик
 ID_Link_Klient-Числовой(для связки с Klient)
 Foto-Поле объекта OLE
 |  
|   | Илья Бабаков (статус: Посетитель), 25 мая 2007, 16:00 [#5]:По поводу хранения в БД пути к рисунку, можно подробнее |  
|   | Venom (статус: 1-ый класс), 28 мая 2007, 07:20 [#6]:Долго меня не было. Отдыхал в выходные  Сейчас попытаемся снова разобраться вместе.
 Такс, а зачем хранить путь к рисунку в базе?  Можно ведь просто записать этот самый рисунок в базу, что я собственно и предлагал.
 Предположим, ситуацию:
 база Klient
 поля ID_Klient = 1
 Fam = Иванов И.И.
 
 база Foto
 поля ID_Link_Klient = 1
 Foto - рисунок 1
 
 Требуется загрузить на форму для клиента 1 рисунок 1, т.е. его фотографию. Будем делать, например, так:
 AdoQuery1.SQL.Text:='select Foto from Foto where ID_Link_Klient=1';
 AdoQuery1.Open;
 и далее применяем процедуру загрузки изображений из базы. В качестве иконки можно показывать уменьшенное изображение. Все это я описывал в предыдущих ответах.
 И еще, скажи свой e-maiL, я тебе на него вышлю пример, набросал кое-что по твоей проблеме пока на работе делать нечего
   |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |