-
Как получить наиболее быстрый доструп к пикселям растра? Какие для это сущ. средства? Перечислейте, пожалуйста. Если возможно - с примерами.
-
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 (07.01.09 23:41) [2] > > А ещё? :)
А еще посмотри FastDIB
-
2 Vetal
Через TRGBTriple будет быстрее, тем более что в примере несколько раз вычисляется одно и тоже.
-
> Через TRGBTriple будет быстрее
Не будет.
-
Что касается наиболее быстрого то. Лучше свой класс. Память выравнивать на границе 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]; 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(pix,LL)
end;
Canvas.Draw(0, 0, Pic);
end; // Тут можно попробовать еще с оптимизировать. 24бита нехороший формат. Лучше 32 тогда код получается оптимальнее. Выигрываем в скоросте проигрываем в памяти.
-
> 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;
-
Хотя, особой разницы в скорости нет, и 1 вариант работает даже быстрее.
-
> Не будет.
PByteArray быстрее, в том случае, если его обрабатывать не 3 поля а одно. В остальных случаях он медленнее чем TRGBTriple.
> Хотя, особой разницы в скорости нет, и 1 вариант работает даже быстрее.
Действительно, скорость обработки одинакова, да и циклом For работать нагляднее.
-
> SuperPROgrammist
Еще раз хочу напомнить про FastDIB. То что тебе требуется в ней обсосано уже быстрей некуда (имеется в виду быстрый доступ к массиву бит данных растра) .
-
> Хотя, особой разницы в скорости нет, и 1 вариант работает > даже быстрее.
Спасибо что поправил писал прямо сдесь. Но вот насчет скорости не соглашусь этот вариант дает в 2 раза прирост скорости.
-
Просто тестировать лучше на Pic.Width := 1000; Pic.Height := 1000;
|