Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2012, 12:03   #1
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию Загрузка изображения из БД

Всем привет! Столкнулся с такой проблемой:

Имеется БД, в ней имеется таблица для хранения изображений, в таблице имеется поле Data, в которое я загружаю изображения в 16-тиричной системе, т.е. по сути изображение хранимое в БД выглядит примерно так
Код:
424daea704000000000036000000280000001c01000066010000010018000000000000000000732
60000732600000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffffffffffffffffefefe......
Вопрос вот какой, как загрузить это изображение в TImage?
Тобишь перевести из 16-тиричной системы в готовый BitMap


Может кто сталкивался с таким, подскажите пожалуйста?
{Shadowevil} вне форума Ответить с цитированием
Старый 15.08.2012, 21:27   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Использовать DBImage пробовали?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 15.08.2012, 23:21   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Читаешь из БД массив байт.
Пишешь этот массив в MemoryStream.
Загружаешь данные в Bitmap из выше созданного MemoryStream.
Пишешь что-то наподобие этого: Image1.Picture.Assign(tmpBitmap);
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 16.08.2012, 05:04   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А зачем хранить картинку именно в 16-ти ричной системе?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 16.08.2012, 09:41   #5
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Использовать DBImage пробовали?
нет, не пробовал. DBImage преобразует байтовое значение в битпам?

Цитата:
Сообщение от spamer Посмотреть сообщение
Читаешь из БД массив байт.
Пишешь этот массив в MemoryStream.
Загружаешь данные в Bitmap из выше созданного MemoryStream.
Пишешь что-то наподобие этого: Image1.Picture.Assign(tmpBitmap);
Спасибо, конечно, но алгоритм я примерно представляю, а вот как записать этот алгоритм в виде кода - не очень

Цитата:
Сообщение от artemavd Посмотреть сообщение
А зачем хранить картинку именно в 16-ти ричной системе?
Так уж сложилось, что картинки, загружаемые на сервер perl-скриптом преобразуются в байтовое значение, после чего собирается БД SQLite и отправляется на рабочую машину пользователя, поэтому чтобы не отправлять сами изображения, другого выхода пока не придумал.

Да и зачем переделывать, когда осталось доделать всего чуть-чуть
{Shadowevil} вне форума Ответить с цитированием
Старый 16.08.2012, 10:06   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

DBImage просто связывается с полем БД, хранящим картинку, и при позиционировании курсора на записи берет из данного поля данной записи значение. Как и любой DBDataControls-компонент
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 16.08.2012, 10:21   #7
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
DBImage просто связывается с полем БД, хранящим картинку, и при позиционировании курсора на записи берет из данного поля данной записи значение. Как и любой DBDataControls-компонент
Нет, мне это точно не подходит. У меня нет DBGrid'a или что-то подобного.

У меня есть Query, который берет необходимое поле из БД и записывает данные в динамический массив, после чего связь с БД закрывается.
В это же время включается таймер, в котором собственно и должны преобразовываться полученные значения из массива в изображение. Как то так
{Shadowevil} вне форума Ответить с цитированием
Старый 16.08.2012, 10:32   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если картинка уже прочитана из базы, например в MemoryStream, то последовательно каждые 2 байта с помощью HexToBin преобразуем в байт и пишем в другой MemoryStream, из которого по концу преобразования загружаем в Image
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.08.2012, 13:47   #9
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если картинка уже прочитана из базы, например в MemoryStream, то последовательно каждые 2 байта с помощью HexToBin преобразуем в байт и пишем в другой MemoryStream, из которого по концу преобразования загружаем в Image
у меня есть вот такая процедура:
Код:
Procedure TFrmMain.StrToBMP(Str: String; var stre: TMemoryStream);
var
  i, j, Len: integer;
  Stream: TMemoryStream;
  Arr : array of Byte;
  s: string;
begin

 Stream:=TMemoryStream.Create;
 Len := Length(Str) div 2 ;
 SetLength(Arr, Len);

 Stream.Position:=0;
 i:=1;
 while i<Len do
 begin
  Arr[i]:=HexToBin(PAnsiChar('$'+Str[(i*2)-1]+Str[i*2]), PAnsiChar(Arr), Length(Arr));
  i:=i+1;
 end;
for j:=1 to Length(Arr) do
 stre.WriteBuffer(PAnsiChar(Arr), Length(Arr));


 Stream.Free;
end;
Str - это Hex-строка из БД
stre - выходящий поток

Вызываю её вот так:
Код:
Stream:=TMemoryStream.Create;

 .....

   FrmMain.StrToBMP(ZQuery1.FieldByName('data').AsString, Stream);

   Image2.Picture.Bitmap.LoadFromStream(Stream);

 .....
Знаю что не правильно, но как правильно сделать не знаю мозг уже плавится
{Shadowevil} вне форума Ответить с цитированием
Старый 16.08.2012, 16:56   #10
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну как вариант - выводить массив байт во временный файл типа file of byte а затем загружать через Image.LoadFromFile (точное название процедуры не помню, но она есть
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка изображения iiunbreakableii Общие вопросы Delphi 1 13.02.2011 20:30
загрузка изображения wlords Помощь студентам 3 24.11.2010 20:52
Загрузка изображения _-Re@l-_ Общие вопросы Delphi 7 31.05.2010 14:54
Загрузка изображения из exe Volkogriz Общие вопросы Delphi 13 18.01.2010 17:51
Загрузка изображения JRcoker Мультимедиа в Delphi 15 04.11.2008 18:32