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

Вниз

Быстрый доступ к пикселям растра.   Найти похожие ветки 

 
SuperPROgrammist   (2009-01-07 21:57) [0]

Как получить наиболее быстрый доструп к пикселям растра? Какие для это сущ. средства?
Перечислейте, пожалуйста. Если возможно - с примерами.


 
Vetal   (2009-01-07 23:24) [1]

ScanLine.

Например, сделаем изображение красным.

var
 Pic: TBitmap;
 pix: PByteArray;
 i, j: integer;
begin
 Pic := TBitmap.Create;
 Pic.PixelFormat := pf24bit;
 Pic.Width := 100;
 Pic.Height := 100;
 for i := 0 to Pic.Height - 1 do begin
   pix := Pic.ScanLine[i];
   for j := 0 to Pic.Width - 1 do begin
     pix[j * 3] := 0;
     pix[j * 3 + 1] := 0;
     pix[j * 3 + 2] := 255;
   end;
 end;
 Canvas.Draw(0, 0, Pic);
end;


 
SuperPROgrammist   (2009-01-07 23:41) [2]

А ещё? :)


 
Vetal   (2009-01-07 23:58) [3]


> А ещё? :)


http://www.delphimaster.ru/articles/pixels/


 
DVM ©   (2009-01-09 12:16) [4]


> SuperPROgrammist   (07.01.09 23:41) [2]
>
> А ещё? :)

А еще посмотри FastDIB


 
SuperPROgrammist   (2009-01-14 11:30) [5]

2 Vetal

Через TRGBTriple будет быстрее, тем более что в примере несколько раз вычисляется одно и тоже.


 
Омлет   (2009-01-14 20:39) [6]

> Через TRGBTriple будет быстрее

Не будет.


 
Pavia ©   (2009-01-15 02:21) [7]

Что касается наиболее быстрого то.
Лучше свой класс. Память выравнивать на границе 16 это если планируешь использовать xmm.
Теперь про обращение через ScanLine.

var
Pic: TBitmap;
pix: PByteArray;
LL,WW,i, j: integer;
begin
Pic := TBitmap.Create;
Pic.PixelFormat := pf24bit;
Pic.Width := 100;
Pic.Height := 100;
p:=Pic.ScanLine[0]; // Получаем базу эканомим на вызове.
LL:=Pic.ScanLine[1]-Pic.ScanLine[0]; // Длина линии. Из-за выравнивания отличается от Width*3, а также имеет противоположный знак из-за обратного порядка строк.
WW:=Pic.Width*3; // Не умеет дельфи хорошо оптимизировать поможем ему.
//Цикл заменяем на while так можем экономить на переменной и регистре.
i:=0;
while   i<Pic.Height do
 begin
 j:=0;
 while j< WW  do begin
   // while позволяет еще убрать умножение, а также мы избавились от части лишних сложений
    pix[j] := 0;
    Inc(j);    
    pix[j] := 0;
    Inc(j);    
    pix[j] := 255;
    Inc(j);          
  end;
 inc(pix,LL)
end;
Canvas.Draw(0, 0, Pic);
end;


// Тут можно попробовать еще с оптимизировать.
24бита нехороший формат. Лучше 32 тогда код получается оптимальнее. Выигрываем в скоросте проигрываем в памяти.


 
Vetal   (2009-01-15 22:09) [8]


> Pavia ©   (15.01.09 02:21) [7]


Есть пара ошибочек, расчёт LL и счётчик цикла забыли )

var
 Pic: TBitmap;
 Pix: PByteArray;
 LL, WW, i, j: integer;
begin
 Pic := TBitmap.Create;
 Pic.PixelFormat := pf24bit;
 Pic.Width := 100;
 Pic.Height := 100;

 Pix := Pic.ScanLine[0];
 LL := Cardinal(Pic.ScanLine[1]) - Cardinal(Pic.ScanLine[0]);
 WW := Pic.Width * 3;

 i := 0;
 while i < Pic.Height do begin
   j := 0;
   while j < WW do begin
     Pix[j] := 0;    Inc(j);
     Pix[j] := 0;    Inc(j);
     Pix[j] := 255;  Inc(j);
   end;
   Inc(Cardinal(Pix), LL);
   Inc(i);
 end;
 Canvas.Draw(0, 0, Pic);
end;


 
Vetal   (2009-01-15 22:18) [9]

Хотя, особой разницы в скорости нет, и 1 вариант работает даже быстрее.


 
SuperPROgrammist   (2009-01-16 18:12) [10]

> Не будет.

PByteArray быстрее, в том случае, если его обрабатывать не 3 поля а одно.
В остальных случаях он медленнее чем TRGBTriple.

> Хотя, особой разницы в скорости нет, и 1 вариант работает даже быстрее.

Действительно, скорость обработки одинакова, да и циклом For работать нагляднее.


 
DVM ©   (2009-01-17 20:59) [11]


> SuperPROgrammist

Еще раз хочу напомнить про FastDIB. То что тебе требуется в ней обсосано уже быстрей некуда (имеется в виду быстрый доступ к массиву бит данных растра) .


 
Pavia ©   (2009-01-18 20:28) [12]


> Хотя, особой разницы в скорости нет, и 1 вариант работает
> даже быстрее.

Спасибо что поправил писал прямо сдесь. Но вот насчет скорости не соглашусь этот вариант дает в 2 раза прирост скорости.


 
Pavia ©   (2009-01-18 20:32) [13]

Просто тестировать лучше на
Pic.Width := 1000; Pic.Height := 1000;



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

Форум: "Media";
Текущий архив: 2013.07.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
1-1308586094
Prok186
2011-06-20 20:08
2013.07.14
Как аддрессовать не 2Gb, а 4Gb памяти?


15-1361910606
Юрий
2013-02-27 00:30
2013.07.14
С днем рождения ! 27 февраля 2013 среда


3-1289455456
daniyar
2010-11-11 09:04
2013.07.14
Как вывести в TreeView базу данных SQL Server с таблицами


4-1265267672
keymaster
2010-02-04 10:14
2013.07.14
Delphi + PGP


15-1361788959
Медвежонок Пятачок
2013-02-25 14:42
2013.07.14
сила воли и свобода выбора у зайца





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский