Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не могу сохранить рисунок в БД с его измененными размерами / 9 сообщений из 9, страница 1 из 1
08.10.2017, 14:43:27
    #39532929
Kos-2010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
Доброе время суток форумчане,
Есть БД и форма на которой находится компоненты TMyDBImage (просматривает рисунки из БД) и TImage (таким же размером, как и TMyDBImage) ит.д.
Мне нужно перед сохранением картинки в БД, подогнать ее размеры под TMyDBImage.
Для этого я загружаю картинку сначало в TImage, сразу же подгоняю ее размеры под необходимые.
Далее с помощью потока перезаписываю ее в поле типа “blob”, все замечательно.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Var
qq: TMemoryStream;

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);      
….


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

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

Спасибо за ответ
...
Рейтинг: 0 / 0
08.10.2017, 14:54:49
    #39532934
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
Kos-2010Image1.Picture.Bitmap

А где размеры устанавливаются ?
...
Рейтинг: 0 / 0
08.10.2017, 15:03:22
    #39532936
Kos-2010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
До этого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
...
procedure TForm1.Button5Click(Sender: TObject);
var
  Pic: TPicture;
  k: Real;
  r1, r2: TRect;
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;
...

все походит нормально

просто я проверял на другом TImage2

Код: pascal
1.
2.
qq.Position := 0;
Image2.Picture.Bitmap.LoadFromStream(qq);


и отображается нормально
...
Рейтинг: 0 / 0
08.10.2017, 15:27:44
    #39532942
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
Kos-2010,

Перезаписывать поле - это хорошо.
Но поле - это только область оперативной памяти.
А где запись в БД?
...
Рейтинг: 0 / 0
08.10.2017, 15:47:04
    #39532947
Kos-2010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
В первом комментарии..
Код: pascal
1.
2.
qq.Position := 0;
TBlobField(ibdsFeatures.FieldByName('VOICE_IMAGE')).LoadFromStream(qq);  



Просто нужно тогда было предоставить полность код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
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;
...
Рейтинг: 0 / 0
08.10.2017, 19:54:39
    #39533049
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
Kos-2010,

А где собственно запись в базу ?
Из этого кода не следует, что картинка пишется в базу.
...
Рейтинг: 0 / 0
09.10.2017, 09:50:08
    #39533210
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
Kos-2010,

Как минимум нужны вызовы методов Post и Commit
...
Рейтинг: 0 / 0
09.10.2017, 14:48:13
    #39533454
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
Kos-2010
Код: pascal
1.
2.
3.
4.
qq := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(qq);
qq.Position := 0;
TBlobField(ibdsFeatures.FieldByName('VOICE_IMAGE')).LoadFromStream(qq);    

Вот нафига это извращение? Почему нельзя написать просто
Код: pascal
1.
2.
3.
4.
5.
6.
qq := ibdsFeatures.CreateBlobStream(ibdsFeatures.FieldByName('VOICE_IMAGE'), bmWrite);
try
  Image1.Picture.Bitmap.SaveToStream(qq);
finally
  qq.Free;
end;

Никакого каста к TBlobField, никакого гоняния данных туда-сюда по памяти. Или это слишком просто?
...
Рейтинг: 0 / 0
09.10.2017, 19:25:34
    #39533657
Kos-2010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не могу сохранить рисунок в БД с его измененными размерами
[/src][/quot]Вот нафига это извращение? Почему нельзя написать просто
Код: pascal
1.
2.
3.
4.
5.
6.
qq := ibdsFeatures.CreateBlobStream(ibdsFeatures.FieldByName('VOICE_IMAGE'), bmWrite);
try
  Image1.Picture.Bitmap.SaveToStream(qq);
finally
  qq.Free;
end;

Никакого каста к TBlobField, никакого гоняния данных туда-сюда по памяти. Или это слишком просто?[/quot]

- да конечно освобожать память конечно необходимо
- "Post" проходит вдругом месте. Просто код изменения размера картинки я вынес отдельную процедуру.
- сам вопрос возник потому что в разделе "else"
строки:
Код: pascal
1.
2.
Width := r2.Right;
        Height := r2.Bottom;


были расположены до:
Код: pascal
1.
2.
StretchBlt(iControlImage.Picture.Bitmap.Canvas.Handle, 0, 0, r2.Right, r2.Bottom, 
                   Canvas.Handle, 0, 0, r1.Right, r1.Bottom, SRCCOPY);



Еще раз спасибо за советы
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не могу сохранить рисунок в БД с его измененными размерами / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]