Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Инвертирование Bitmap(GDI+)


Автор: VICTAR 4.2.2008, 19:43
Всем привет.
Использую GDI+(http://www.delphisources.ru/pages/sources/graph/2007_year/gdi_plus_api.html).
Загружаю большую Bitmap`ку (примерно 5000 на 5000). Отображаю ее на PaintBox, который в свою очередь лежит на ScrollBox`e. Изображение скроллируется нормально.
Затем инвертирую эту Bitmap`ку и при скролле возникают жуткие тормоза.
Не могу понять, в чем тут дело.
Тестовый проект прикрепляю(за исключением Bitmap`ки )

Автор: Alexeis 4.2.2008, 20:26
Цитата(VICTAR @  4.2.2008,  18:43 Найти цитируемый пост)
Загружаю большую Bitmap`ку (примерно 5000 на 5000). 

  5000 * 5000 * 3 = 72 Мб !!! Представь себе сколько займет отрисовка такой картинки! Ведь PiantBox не подозревает, что его область вывода небольшая и пытается все рисовать. 

Автор: VICTAR 4.2.2008, 20:35
Alexeis, ест-но в своем проекте я отрисовку делаю подругому  smile 
Но эффект, который я описал, возникает независимо от способа отрисовки.

Автор: VICTAR 6.2.2008, 18:16
Товарищи, может хоть у кого-нибудь есть хоть какие-нибудь предположения? 
Рассмотрю все варианты!

Автор: Alexeis 6.2.2008, 18:31
Цитата(VICTAR @  6.2.2008,  17:16 Найти цитируемый пост)
Товарищи, может хоть у кого-нибудь есть хоть какие-нибудь предположения? 

  Засекай время, и определяй какие методы выполняются дольше всего smile , дальше будем думать чего можно оптимизировать. Сужай круг поиска.

Автор: VICTAR 6.2.2008, 23:54
Цитата(Alexeis @  6.2.2008,  18:31 Найти цитируемый пост)
дальше будем думать чего можно оптимизировать

Но тут дело не в оптимизации....
Торможение возникает только после каких-либо операций с растром.

Автор: Alexeis 7.2.2008, 01:48
Цитата(VICTAR @  6.2.2008,  22:54 Найти цитируемый пост)
Торможение возникает только после каких-либо операций с растром.

  А если нарисовать всего 1 пиксель? Тоже будет тормозить?

Автор: VICTAR 7.2.2008, 01:50
Сейчас проверю...

Добавлено через 2 минуты и 18 секунд
да, эффект тот же

Автор: Alexeis 7.2.2008, 02:02
В текущем примере я вижу что рисуется вся битмапка 
Код

procedure TForm1.pbxPaint(Sender: TObject);
var
  lCanvas: TGPGraphics;
begin
  lCanvas := TGPGraphics.Create(pbx.Canvas.Handle);
  try
    if Assigned(lBmp) then
      lCanvas.DrawImage(lBmp, 0, 0, lBmp.GetWidth, lBmp.GetHeight);
  finally
    lCanvas.Free;
  end;
end;


А не только видимый фрагмент. После такого рисования возможно GPBitmap превращается в Dib секцию, а она уже рисуется по другому, возможно не так эффективно как обычны битмап.

Автор: VICTAR 7.2.2008, 02:08
Код

procedure TForm1.pbxPaint(Sender: TObject);
var
  lCanvas: TGPGraphics;
begin
  with pbx.Canvas do
    FillRect(ClipRect);
  lCanvas := TGPGraphics.Create(pbx.Canvas.Handle);
  try
    if Assigned(fBmp) then
    begin
      lCanvas.DrawImage(fBmp, GPRectMake(pbx.ClientRect),
        HScroll.Position, VScroll.Position, pbx.Width, pbx.Height, UnitPixel);
    end;
  finally
    lCanvas.Free;
  end;
end;

где HScroll.Position - горизонатльный скролл
VScroll.Position - вертикальный скролл
pbx - PaintBox
но почему же если с картинкой не производить никаких действий отрисовка происходит на ура! стоит только вызвать LockBits&UnlockBits и все! при скролле проц на 100% и память жрется как бешенная.
вот в чем вопрос...

Добавлено через 8 минут и 17 секунд
По поводу прикрепленного примера: там у PaintBox align = alClient, а для кода, приведенного выше align = alNone. 
Это я на всякий случай, чтобы не было недоразумений.

Автор: MetalFan 7.2.2008, 09:15
попробуй "скэшировать" обработанный TGPBitmap в TGPCachedBitmap. он должен быстрее рисоваться

Автор: VICTAR 7.2.2008, 18:46
К сожалению TGPCachedBitmap не поможет, т.к. мне надо отрисовывать только видимую часть картинки, а с TGPCachedBitmap этого сделать нельзя.

Автор: VICTAR 17.2.2008, 06:23
Отказался от использования GDI+.
Удалось добиться нужного результат с помощью GDI.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)