Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.076 c
14-1095846283
080D:07BBh
2004-09-22 13:44
2004.10.17
Предложение.


1-1096545408
Kost
2004-09-30 15:56
2004.10.17
Проблема белеющей формы


1-1096976842
СержК
2004-10-05 15:47
2004.10.17
Ошибка при установке компонент


3-1095927489
Иванов Сергей
2004-09-23 12:18
2004.10.17
Чем пользоваться для доступа к DBF+IDX


3-1095851327
Карелин Артем
2004-09-22 15:08
2004.10.17
Использование Midas.dll в Win 2000.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский