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

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

Можно ли как-нибудь ускорить работу с Canvas.Pixels [] [D5, Win95/98]


JC ©   (2002-05-04 12:04:00) 

Мне надо обрабатывать Большую картинку (1024х768) переставляя в ней пиксели, но при стандартных функциях это занимает от 30 сек до 1,5 минуты, видел подобную программу под DOS, скорость мгновенная. Заранее благодарен.


MBo   (2002-05-09 21:24:00) [1]

procedure TForm1.Button1Click(Sender: TObject);
var b:tbitmap;
a:array[0..9,0..9] of TRGBQuad;
bi:tbitmapinfo;
i,j:integer;
s:string;
begin
b:=tbitmap.create;
b.PixelFormat:=pf24bit;
b.width:=10;
b.height:=10;
b.canvas.MoveTo(0,0);
b.canvas.LineTo(5,5);
image1.picture.assign(b);
with bi.bmiHeader do begin
biWidth:=b.Width;
biHeight:=b.Height;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=32;
biPlanes:=1;
biSizeImage:=0;
end;
GetDiBits(b.canvas.handle,b.handle,0,10,@a,bi,DIB_RGB_COLORS);
for i:=0 to 9 do begin
s:="";
for j:=0 to 9 do
s:=s+inttohex(a[i,j].rgbGreen,2) +" ";
memo1.lines.add(s);
end;
memo1.lines.add("");

PatBlt(b.canvas.handle,0,0,10,10,whiteness) ;

for i:=0 to 9 do
for j:=0 to 9 do begin
a[i,j].rgbRed:=0;
a[i,j].rgbGreen:=255*Ord(i<>j);
a[i,j].rgbBlue:=0;
end;

for i:=0 to 9 do begin
s:="";
for j:=0 to 9 do
s:=s+inttohex(a[i,j].rgbGreen,2) +" ";
memo1.lines.add(s);
end;

SetDiBits(b.canvas.handle,b.handle,0,10,@a,bi,DIB_RGB_COLORS);
image2.picture.assign(b);
b.free;
end;


JC   (2002-05-09 16:04:00) [2]

MBo можешь хоть короткий пример привести?


JC   (2002-05-08 19:52:00) [3]

А хоть чуть-чуть исходника, если можно.


MBo   (2002-05-08 07:08:00) [4]

C помощью GetDiBits получаем двумерный массив, причем с инверсией - левй угол картинки в конце массива, делаем манипуляции, потом SetDiBits


JC   (2002-05-07 23:45:00) [5]

Да, может что-то со мной, но по-моему GetDiBits копирует построчно, а надо попиксельно. Если я ошибаюсь, кто-нибудь приведите пример аналога Canvas.Pixels[x+z,y]:=Canvas.Pixels[x,y]


Nikolay   (2002-05-07 21:03:00) [6]

scanline


JC   (2002-05-07 20:43:00) [7]

SPeller А можно хотя-бы одну процедуру(функцию) для поиска.


SPeller   (2002-05-04 14:13:00) [8]

Используй WinAPI и всё будет "летать".


MBo   (2002-05-04 14:08:00) [9]

при работе через Scanline скорость повысится на 1-2 порядка.
При использовани GetDiBits, если это подходит, можно еще быстрее.
Посмотри также сайт delphigfx.mastak.ru.


JC   (2002-05-04 12:49:00) [10]

Помоему на "C"...


Song   (2002-05-04 12:44:00) [11]

Эта програма была сделана на асме.


Наверх

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