|
Вопрос # 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, я тебе на него вышлю пример, набросал кое-что по твоей проблеме пока на работе делать нечего
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|