powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не могу сохранить рисунок в БД с его измененными размерами
9 сообщений из 9, страница 1 из 1
Не могу сохранить рисунок в БД с его измененными размерами
    #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
Не могу сохранить рисунок в БД с его измененными размерами
    #39532934
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010Image1.Picture.Bitmap

А где размеры устанавливаются ?
...
Рейтинг: 0 / 0
Не могу сохранить рисунок в БД с его измененными размерами
    #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
Не могу сохранить рисунок в БД с его измененными размерами
    #39532942
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

Перезаписывать поле - это хорошо.
Но поле - это только область оперативной памяти.
А где запись в БД?
...
Рейтинг: 0 / 0
Не могу сохранить рисунок в БД с его измененными размерами
    #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
Не могу сохранить рисунок в БД с его измененными размерами
    #39533049
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kos-2010,

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

Как минимум нужны вызовы методов Post и Commit
...
Рейтинг: 0 / 0
Не могу сохранить рисунок в БД с его измененными размерами
    #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
Не могу сохранить рисунок в БД с его измененными размерами
    #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
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не могу сохранить рисунок в БД с его измененными размерами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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