Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Canvas.Pixels быстрее?   Найти похожие ветки 

 
debuger ©   (2004-09-30 20:43) [0]

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

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-09-30 20:46) [1]

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


 
debuger ©   (2004-09-30 21:45) [2]

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

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


 
GuAV ©   (2004-09-30 22:05) [3]

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


 
debuger ©   (2004-09-30 22:11) [4]

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

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

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


 
Рыба ©   (2004-09-30 22:11) [5]

>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;  

Мдя :))


 
DiamondShark ©   (2004-09-30 22:13) [6]

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


 
Рыба ©   (2004-09-30 22:14) [7]

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

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


 
DiamondShark ©   (2004-09-30 22:15) [8]

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


 
debuger ©   (2004-09-30 22:16) [9]

2 Рыба.

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

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

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


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


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

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


 
DiamondShark ©   (2004-09-30 22:18) [11]


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

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


 
Рыба ©   (2004-09-30 22:23) [12]

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


 
Рыба ©   (2004-09-30 22:31) [13]

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

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;


 
Mihey_temporary ©   (2004-09-30 22:41) [14]

Поддерживаю Рыбу. Протестировал код 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:42) [15]

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

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


 
DiamondShark ©   (2004-09-30 22:50) [16]

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


 
DiamondShark ©   (2004-09-30 22:53) [17]

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

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


 
Рыба ©   (2004-09-30 22:59) [18]

>debuger ©

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


 
debuger ©   (2004-10-03 16:51) [19]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.041 c
1-1096541936
Мирон
2004-09-30 14:58
2004.10.17
Потоки мешаю друг другу


3-1094180249
Новенький
2004-09-03 06:57
2004.10.17
Поиск по базе


1-1096983368
samalex
2004-10-05 17:36
2004.10.17
Поднять окно excel.


3-1095447651
eLimar
2004-09-17 23:00
2004.10.17
Производительность и способы коннекта


14-1095878044
Sheng
2004-09-22 22:34
2004.10.17
Любителям комьютерной 3d графики