Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.10.2017, 15:18
Konstantin-78 Konstantin-78 вне форума
Прохожий
 
Регистрация: 27.04.2015
Сообщения: 37
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Не получается сохранить рисунок в БД с его измененными размерами

Доброе время суток форумчане,
Есть БД и форма на которой находится компоненты TMyDBImage (просматривает рисунки из БД) и TImage (таким же размером, как и TMyDBImage) ит.д.
Мне нужно перед сохранением картинки в БД, подогнать ее размеры под TMyDBImage.
Для этого я загружаю картинку сначало в TImage, сразу же подгоняю ее размеры под необходимые.
Далее с помощью потока перезаписываю ее в поле типа ”blob”, все замечательно.

Код:
procedure TFMain.Button2Click(Sender: TObject);
var
  Pic: TPicture;
  k: Real;
  r1, r2: TRect;
  qq: TMemoryStream;
begin
  if OpenPictureDialog1.Execute then
  begin
    Pic := TPicture.Create;
    with Image1.Picture.Bitmap do
    try
      Pic.LoadFromFile (OpenPictureDialog1.FileName);
      Assign (Pic.Graphic);
      Pic.Free;

      k := Max (Height/Image1.Height, Width/Image1.Width);
      r1 := Rect (0, 0, Width, Height);
      r2 := Rect (0, 0, Round (Width / k), Round (Height / k));

      SetStretchBltMode (Canvas.Handle, HALFTONE);
      if k < 1 then begin
        Width := r2.Right;
        Height := r2.Bottom;
        StretchBlt (Image1.Picture.Bitmap.Canvas.Handle, 0, 0, r2.Right, r2.Bottom, Canvas.Handle, 0, 0, r1.Right, r1.Bottom, SRCCOPY);
qq := TMemoryStream.Create;
qq.Position := 0;
TBlobField(ibdsFeatures.FieldByName('VOICE_IMAGE')).LoadFromStream(qq);        
      end
      else 
      begin
StretchBlt (Image1.Picture.Bitmap.Canvas.Handle, 0, 0, r2.Right, r2.Bottom, Canvas.Handle, 0, 0, r1.Right, r1.Bottom, SRCCOPY);
qq := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(qq);
qq.Position := 0;
TBlobField(ibdsFeatures.FieldByName('VOICE_IMAGE')).LoadFromStream(qq);                
        Width := r2.Right;
        Height := r2.Bottom;
      end;
    except
      on E: EInvalidGraphic do
        ShowMessage('Ошибка загрузки');
      on E: EConvertError do
        ShowMessage('Ошибка конвертирования');
    else
      ShowMessage('Прочие ошибки: ' + #13 + Exception(ExceptObject).Message);
    end;
  end;

end;

Но при последующем просмотре картинки в «TMyDBImage» (из БД), размеры картинки остались такими, как и до ее изменения.

В чем может быть ошибка?

Спасибо за ответ

Последний раз редактировалось Konstantin-78, 08.10.2017 в 17:33.
Ответить с цитированием
  #2  
Старый 08.10.2017, 18:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,751
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Видимо ещё нужно post у ibdsFeatures вызвать после заполнения поля
Ответить с цитированием
  #3  
Старый 08.10.2017, 18:27
Konstantin-78 Konstantin-78 вне форума
Прохожий
 
Регистрация: 27.04.2015
Сообщения: 37
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Видимо ещё нужно post у ibdsFeatures вызвать после заполнения поля
Это делается для commit записи/картинки в БД. С этим проблем нет - картинка сохраняется в БД....


У меня потом "TMyDBImage" (из БД) отображает картинку в базовых (не измененных) размерах

У меня в БД, почему-то картинка с НЕизмененным размером, хотя по идее я в поле пишу уже картинку с новыми размерами

Я это проверяю таким способом
Код:
qq := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(qq);
qq.Position := 0;
Image2.Picture.Bitmap.LoadFromStream(qq);
qq.Position := 0;
TBlobField(ibdsFeatures.FieldByName('VOICE_IMAGE')).LoadFromStream(qq); 

перед вставкой в БД, беру и просто поток пишу в "Image2" и в "Image2" картинка отображается корректно

Последний раз редактировалось Konstantin-78, 08.10.2017 в 18:42.
Ответить с цитированием
  #4  
Старый 08.10.2017, 19:58
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,751
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Жалко, не могу проверить ваш вариант на сборке, нету некоторых компонентов, но вот пример из drkb, немного там по-другому идёт загрузка
Вложения
Тип файла: zip ImgBlob.zip (205.4 Кбайт, 0 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Konstantin-78 (08.10.2017)
  #5  
Старый 08.10.2017, 20:36
Konstantin-78 Konstantin-78 вне форума
Прохожий
 
Регистрация: 27.04.2015
Сообщения: 37
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

спасибо разобрался,
просто строку:
Код:
TBlobField(ibdsFeatures.FieldByName('VOICE_IMAGE')).LoadFromStream(LImage);
нужно было ставить после строк:
Код:
Width := r2.Right;
        Height := r2.Bottom;
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter