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


Автор: hug 7.8.2007, 08:47
Есть картотека с фотографиями (BLOB)-поле
Если есть фотка то гружу ее из потока, а если нет принято решение закрашивать место под фото белым. Вот код закраски:
Код



procedure ClearImage(a: TDBImage);
var
    R:Trect;
begin
 with a.Picture.Bitmap.Canvas   do  
 begin
     Brush.Style:=bssolid; 
     Brush.Color:=clWhite;
     FillRect(ClipRect);
 end;
end;

Но эта закраска работает оч медленно. Даже медленнее чем грузить фото из базы?
Может кто-нибуть знает как быстрее Image сделать белым?

Автор: former 7.8.2007, 09:04
Цитата(hug @  7.8.2007,  08:47 Найти цитируемый пост)
Может кто-нибуть знает как быстрее Image сделать белым?


Есть хороший компонент MyDBImage. Это стандартный DBImage с поддержкой jpeg и возможностью выводить надпись при отсутствии данных в поле. Вот тебе http://www.sql.ru/forum/actualthread.aspx?tid=167492.

Автор: Alexeis 8.8.2007, 17:19
hug, функция PatBtl (см. MSDN) это делает в несколько раз быстрее.

Автор: somewhere 9.8.2007, 15:16
Через TBitmap.ScanLine будет почто в 50 раз быстрее (замерял).
Примерно так:
Код

var B:TBitmap; x:Integer;
begin
B := TBitmap.Create;
B.Width := 200;
B.Height := 100;
B.PixelFormat := pf24bit;
For x := 0 to B.Height-1 do FillChar(B.ScanLine[x]^, B.Width*3, $FF);
img.Picture.Bitmap.ReleaseHandle;
img.Picture.Bitmap := B;
B.Destroy;
end;

Автор: s-mike 10.8.2007, 09:29
Цитата(somewhere @  9.8.2007,  15:16 Найти цитируемый пост)
Через TBitmap.ScanLine будет почто в 50 раз быстрее (замерял).

А где учтено время отрисовки на экране?

Добавлено через 41 секунду
ScanLine — это всего лишь заполнение массива данных в памяти. Отрисовка требует гораздо больше времени.

Автор: somewhere 10.8.2007, 10:09
Цитата(s-mike @  10.8.2007,  09:29 Найти цитируемый пост)
Отрисовка требует гораздо больше времени.

Если вы хоть раз рисовали "напрямую" в видеопамяти, то поймете что примерно столькоже, сколько и заполнение массива. На скорость отрисовки в данном примере влияет только заполнения битмапа. В обоих случаях сама отрисовка выполняется самим компонентом TImage средствами WinAPI

Автор: Alexeis 10.8.2007, 11:58
 s-mike, имел ввиду то что громкие заявления о скорости ничего не дают, так как большая часть времени тратиться на отрисовку битмапа, а не на заполнение его значениями цвета. На самом деле TImage использует не просто API а GDI в котором отрисовка битмапа весьма медленная операция, потому стремиться изо всех сил улучшать этот показатель нет смысла.

Автор: somewhere 10.8.2007, 12:26
Цитата(Alexeis @  10.8.2007,  11:58 Найти цитируемый пост)
потому стремиться изо всех сил улучшать этот показатель нет смысла.

Есть смысл улучшать любой показатель, влияющий на скорость. Тем более, что это дает значительный прирост. А вот медленная прорисовка самого битмапа, это уже косяк разработчиков. Возможно они тоже думали, что битмап проще нарисовать програмно, нежели аппаратно, используя возможности драйвера видеоадаптера. В любом случае ScanLine однажды мне сильно помог, сильно ускорив отрисовку...

Автор: s-mike 10.8.2007, 15:56
Цитата(somewhere @  10.8.2007,  10:09 Найти цитируемый пост)

Если вы хоть раз рисовали "напрямую" в видеопамяти, то поймете что примерно столькоже, сколько и заполнение массива.

А вы рисовали? Будьте добры примерчик, как рисовать в Windows напрямую в видеопамяти. Тогда можете говорить, что эта операция также тривиальна и быстра, как и заполнение массива.

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