Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Canvas.Pixels быстрее? [D5, Win2k]


debuger ©   (2004-09-30 20:43:00) 

Доброго всем всего.
Я явно чего-то недопонимаю, потому хочу услышать ваше мнение.

for i := 0 to 100 do
 for j := 0 to 100 do
   bArray[ i, j ] := vBitMap.vCanvas.Pixels[ i, j ] xor $0000FF;  


скорость (разница GetTickTime) = 50 мс.

for j := 0 to 100 do
 begin
   ptr := vBitMap.ScanLine[ j ];
   for i := 0 to 100 do
     bArray[ i, j ] := p[ i shl 2 ];
 end;  

скорость (разница GetTickTime) = 350 мс. !!!


debuger   (2004-10-03 16:51:00) [1]

Думаю плевать ни в кого особо не нужно.

Весь прикол был BitMap.HandleType = bmDDB, когда он bmDIB сканлайн нереально решает, где-то около 5 мс.


Рыба   (2004-09-30 22:59:00) [2]

>debuger ©

Почитай
http://www.delphimaster.ru/articles/pixels/index.html
Может пригодится ;)


DiamondShark   (2004-09-30 22:53:00) [3]

Вариант со сканлайн дал измеримый результат лишь для размеров выше 1024х1024.

Что-то там не то намеряли...


DiamondShark   (2004-09-30 22:50:00) [4]

Да, это я нагнал, извиняюсь :(


Рыба   (2004-09-30 22:42:00) [5]

>debuger ©  (30.09.04 21:45) [2]
>Кто-то мне сказал, что shl слишком трудоемко.

Плюнь ему в глаз!! :о)))


Mihey_temporary   (2004-09-30 22:41:00) [6]

Поддерживаю Рыбу. Протестировал код debuger © (30.09.04 20:43) у себя - при тех же числах (сканится 100х100) использование Canvas.Pixels даёт 30 мс, а Scanline - 1 мс. При этом не совсем понял, как p[ i shl 2 ] работает (т.к. Delphi матюгался), поэтому использовал что-то вроде этого:


type PByteArray = ^TByteArray;
 TByteArray = array [0..500] of TRGBTriple;

var i, j: Integer;
   p: PByteArray;
begin
for j := 0 to 100 do
begin
  p := vBitMap.ScanLine[ j ];
  for i := 0 to 100 do
    bArray[ i, j ] := p[i].rgbtBlue;
end;


Рыба   (2004-09-30 22:31:00) [7]

Попробуй сравнить скорость попиксельной заливки.

procedure FillBmpWithPixels(Bmp: TBitmap; R, G, B: Byte);
var x, y: Integer;
   Color: TColor;
begin
 Color := RGB(R, G, B);
 for x := 0 to Bmp.Width - 1 do
   for y := 0 to Bmp.Height - 1 do
     Bmp.Canvas.Pixels[x, y] := Color;
end;

procedure FillBmpWithScanLine(Bmp: TBitmap; R, G, B: Byte);
var x, y: Integer;
   p: pByteArray;
begin
 Bmp.PixelFormat := pf24Bit;
 for y := 0 to Bmp.Height - 1 do
 begin
   p := Bmp.ScanLine[y];
   for x := 0 to Bmp.Width - 1 do
   begin
     p[x*3]   := B;
     p[x*3+1] := G;
     p[x*3+2] := R;
   end;
 end;
end;


Рыба   (2004-09-30 22:23:00) [8]

Я с битмапом работал и точно знаю, что ScanLine в десятки раз быстрее Canvas.Pixels.


DiamondShark   (2004-09-30 22:18:00) [9]


> debuger ©   (30.09.04 22:16) [9]

У тебя всегда есть выбор: верить тому, что говорят, или верить своим глазам.


DiamondShark   (2004-09-30 22:17:00) [10]


> Рыба ©   (30.09.04 22:14) [7]

Ты с битмапами работал, или это твоя святая вера?
А код смотрел?


debuger   (2004-09-30 22:16:00) [11]

2 Рыба.

Кроме этой опечатки, ты еще не нашел vBitMap.vCanvas.

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

2 DiamindShark. Говорили, на этом же сайте...


DiamondShark   (2004-09-30 22:15:00) [12]

Работай с битмапами напрямую через API. Компоненты для этого слишком тяжёлые.


Рыба   (2004-09-30 22:14:00) [13]

>DiamondShark ©  (30.09.04 22:13) [6]
>Никто не говорил, что ScanLine быстрее.

Плюнь в лицо этому никто!! ;-))


DiamondShark   (2004-09-30 22:13:00) [14]

Никто не говорил, что ScanLine быстрее.


Рыба   (2004-09-30 22:11:00) [15]

>for j := 0 to 100 do
> begin
>   ptr:= vBitMap.ScanLine[ j ];
>  for i := 0 to 100 do
>   bArray[ i, j ] := p[ i shl 2 ];
> end;  

Мдя :))


debuger   (2004-09-30 22:11:00) [16]

Как move? когда мне нужно каждый четвертый байт из того, что возвращает ScanLine.

Тут шутка в том, что в битмапе грэйскейл изображение, и мне нужно только одну составляющую RGB. Вообще-то задача в том чтобы из битмапа получить двумерный массив байт (елемент массива - значение интенсивности на битмапе), и даже 50 мс для меня очень много! Хотя бы 10-20.

И все-таки на счет мува поподробней...


GuAV   (2004-09-30 22:05:00) [17]

поменяй местами в bArray i и j после чего используй move.
тога scanline быстрее


debuger   (2004-09-30 21:45:00) [18]

Кто-то мне сказал, что shlслишком трудоемко.
Заменил ее на * 4, результаты те же!

Кто говорил, что ScanLine быстрее?


debuger   (2004-09-30 20:46:00) [19]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо