Перейти к содержанию
Fire Monkey от А до Я
  • 0

TBitmap и экономия памяти


Steepe_Hare

Вопрос

Пример, взятый из Интернета:
 

  // clears the canvas
  Image1.Bitmap.Clear(TAlphaColors.White);

    // loads the bitmap using the TOpenDialog.
    if OpenDialog1.Execute then
      MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
    // set the  MyRect coordinates
    MyRect := TRectF.Create(50, 30, 150, 200);
    Image1.Bitmap.Canvas.BeginScene;
    // draws on the rectangle specified by MyRect the area from MyBitmap specified by MyRect
    Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);
    Image1.Bitmap.Canvas.EndScene;

Если мы, допустим, раз в секунду повторяем эту процедуру, постоянно загружая в Image1 новый MyBitmap, то нужно ли делать MyBitmap.Free или очистка памяти происходит сама?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы
19 минут назад, MAD_EVAL сказал:

Чистить обязательно, и я бы ещё, создав MyRect удалил бы его где-нибудь в итоге.

TRectF - не является классом, у него нет конструктора. Create используется чисто синтаксически.

Ссылка на комментарий
  • 0
1 час назад, ZuBy сказал:

обязательно нужно очистить

Вот так получше?

    Image1.Bitmap.Clear(TAlphaColors.White);
    if OpenDialog1.Execute then
    begin
      MyRect := TRectF.Create(50, 30, 150, 200);
      MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
      Image1.Bitmap.Canvas.BeginScene;
      try
        Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);
      finally
        Image1.Bitmap.Canvas.EndScene;
        MyBitmap.Free;
      end;
    end;

 

Ссылка на комментарий
  • 0
19 минут назад, Rusland сказал:

Steepe_Hare, AOpacity в DrawBitmap какой-то странный. Почему 20?

А так MyBitmap.Free оформлено верно.

 

Отсюда взял:

http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FMXTCanvasDrawFunctions_(Delphi)

Ссылка на комментарий
  • 0

Не знаю что ответить. Может быть в старых версиях был диапазон от 0 до 100? 

Возьмите ваш пример, вместо 20 поставьте 0.5 и увидите половинную прозрачность.

PS. Почему-то в Image уже должна быть загружена хоть какая-нибудь картинка (хотя бы 1х1пиксель), иначе ничего не выводит. Не знаю почему.

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
36 минут назад, MAD_EVAL сказал:

Покажите пример. Opacity это single от 0 до 1....

http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FMXTCanvasDrawFunctions_(Delphi)

procedure TForm1.DrawLineClick(Sender: TObject);
var
  p1, p2: TPointF;
begin
  // sets the ends of the line to be drawn
  p1 := TPointF.Create(20, 2);
  p2 := TPointF.Create(350, 400);
  Image1.Bitmap.Canvas.BeginScene;
  // draws the line on the canvas
  Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
  Image1.Bitmap.Canvas.EndScene;
end;
Ссылка на комментарий
  • 0
4 часа назад, Steepe_Hare сказал:

Вот так получше?

Не совсем. То есть - технически правильно, но идеологически - нет.

Проведем мысленный эксперимент: что случится, если на BeginScene возникнет исключение? Правильно, битмап не будет уничтожен, потому что этот код не выполнялся внутри Try. Поэтому, если заниматься буквоедством, то код должен выглядывать так:

  MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]); 
  try
    Image1.Bitmap.Canvas.BeginScene;
    try
      Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);
    finally
      Image1.Bitmap.Canvas.EndScene;
    end;
  finally
    myBitmap.Free;
  end;
Ссылка на комментарий
  • 0
15 часов назад, MAD_EVAL сказал:

Покажите пример. Opacity это single от 0 до 1....

В FMX Opacity всегда от 0 до 1. Не верьте безоговорочно примерам Студии, они не актуальные.

 

Ссылка на комментарий
  • 0
  • Администраторы
8 часов назад, Pax Beach сказал:

В FMX Opacity всегда от 0 до 1. Не верьте безоговорочно примерам Студии, они не актуальные.

 

Не знаю, кто пишет примеры в студию :D Но иногда сам удивляюсь... Мы, конечно, иногда сами делаем примеры, но их не так много.

P.S. Opacity в FMX всегда было от 0 до 1

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...