Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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);

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 25 мая 2007, 10:03


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 28 мая 2007, 07:20; участников в обсуждении: 2.
Илья Бабаков

Илья Бабаков (статус: Посетитель), 25 мая 2007, 06:55 [#1]:

Спасибо за внимание к моей проблеме.
Если честно, я еще не волшебник, а только учусь.
Не могли бы вы подробней описать предложенный вариант (Какая БД, как туды вставлять и тд.)
Если не посчитаете нужным растилковать всё равно огромное спасибо (буду сам разбираться,просто жаль времени на изобретание пятого колеса).
Venom

Venom (статус: 1-ый класс), 25 мая 2007, 07:18 [#2]:

Так и я не волшебник далеко:)
БД на самом деле не принципиальна. Все что от нее(БД) необходимо - поддержка blob полей. А как вставлять я примерно описал в самом начале ответа. Это как вариант, через потоки. Мне кажется, очень удобно и пользуюсь им постоянно.
Можно писать вместо CDS1.Insert;
конструкцию типа CDS1.Append; CDS1.Edit; но это не принципиально.
Собственно загрузка изображение в поле базы:

//создание потока
MS:=TMemoryStream.Create;
MS.LoadFromFile("имя файла");
//запись в базу
(CDS1.FieldByName('Pict') as TBlobField).LoadFromStream(MS);

Надеюсь, хоть чуток стало понятнее... или я не так понял вопрос :) Если нет, спрашивай, не стесняйся.
Илья Бабаков

Илья Бабаков (статус: Посетитель), 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

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, я тебе на него вышлю пример, набросал кое-что по твоей проблеме пока на работе делать нечего :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:25
Выполнено за 0.03 сек.