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

Вниз

Canvas   Найти похожие ветки 

 
Зм1й ©   (2006-07-09 18:15) [0]

Подскажите пожалуйста по TCanvas. Вот есть метод CopyRect, он работает относительно быстро. Но когда нужно скопировать с прозрачностью, приходится использовать метод Draw, и он работает заметно медленнее. Чем можно его заменить, чтобы получилось быстрее?


 
Мефисто   (2006-07-09 18:28) [1]

Тут когдато народ в кладовку посылали (поищи)
http://kladovka.net.ru/index.cgi?pid=dir&rid=1


 
antonn ©   (2006-07-10 07:55) [2]

помнится, там был пример с копированием битмапа на битмап, а не канвасы...


 
KilkennyCat ©   (2006-07-10 08:05) [3]

у битмапов разве нет канвы?
BITBLT шустрит.


 
Gydvin ©   (2006-07-10 11:42) [4]

Можно так

procedure TForm1.Button1Click(Sender: TObject);
begin
 canvas.Brush.Color := clred;
 canvas.Pen.Style := psClear;
 canvas.Rectangle(0, 0, 100, 100);
 canvas.Brush.Color := cllime;
 canvas.Ellipse(20, 20, 80, 80);
 canvas.Brush.Color := clblue;
 canvas.Ellipse(40, 40, 60, 60);
 CopyCanvas(canvas, 0, 0, 100, 100, canvas, 0, 200, clred);
end;

procedure TForm1.CopyCanvas(CNVisx: Tcanvas; Xisx, Yisx, Wisx,
 Hisx: integer; CNVrez: Tcanvas; Xrez, Yrez: integer; COLORdel: tcolor);
type
 TRGB = array[0..1] of record
   R, G, B: Byte;
 end;
 PRGB = ^TRGB;
 trgb_ = packed record
   r, G, b: Byte;
 end;

 function ColorToRGB(Color: TColor): tRGB_;
 begin
   with Result do begin
     b := Lo(Color);
     G := Lo(Color shr 8);
     r := Lo((Color shr 8) shr 8);
   end;
 end;

var
 p, p1: PRGB;
 x, y: integer;
 bitisx, bitrez: tbitmap;
 r: trgb_;
begin
 r := ColorToRGB(COLORdel);
 bitisx := tbitmap.Create;
 bitisx.Width := Wisx;
 bitisx.Height := Hisx;
 bitblt(bitisx.Canvas.Handle, 0, 0, Wisx, Hisx, CNVisx.Handle, 0, 0, SRCCOPY);
 bitisx.PixelFormat := pf24bit;

 bitrez := tbitmap.Create;
 bitrez.Width := Wisx;
 bitrez.Height := Hisx;
 bitblt(bitrez.Canvas.Handle, 0, 0, Wisx, Hisx, CNVrez.Handle, Xrez, Yrez, SRCCOPY);
 bitrez.PixelFormat := pf24bit;
 for y := 0 to bitisx.Height - 1 do begin
   p := bitisx.ScanLine[y];
   p1 := bitrez.ScanLine[y];
   for x := 0 to bitisx.Width - 1 do begin
     if not ((r.B = p[x].B) and (r.r = p[x].r) and (r.g = p[x].g)) then p1[x] := p[x];
   end;
 end;
 bitblt(CNVrez.Handle, Xrez, Yrez, Wisx, Hisx, bitrez.Canvas.Handle, 0, 0, SRCCOPY);
 bitisx.Free;
 bitrez.Free;
end;


 
Зм1й ©   (2006-07-10 13:44) [5]


> Gydvin ©   (10.07.06 11:42) [4]

Большое спасибо за пример. Стало немного быстрее. Но похоже мне ничего сильно не поможет :( Просто я каждые 50 мс выполняю где-то 500 000 таких операций, и, как оказалось, даже bitblt здесь не сильно рулит :)


 
Gydvin ©   (2006-07-10 14:19) [6]


> Зм1й ©   (10.07.06 13:44) [5


Ты здесь можеш выкинуть битмапы в секцию private, а создание и высвобождение последних в Button1Click, строки типа (bitisx.PixelFormat := pf24bit;) туда же. То есть сделать их глобальными (один раз создать, а потом один раз уничтожить, а не как здесь при каждом вызове функции), это должно ускорить выполнение.


> выполняю где-то 500 000 таких операций,


а зачем так много. Подробнее опишите, может все проще....


 
KilkennyCat ©   (2006-07-10 14:33) [7]

нда... 10 миллионов пакетов операций в секунду...


 
Gydvin ©   (2006-07-10 14:43) [8]

так же можно избавиться и от bitblt если на вход процедуры подавать не canvas"ы а сразу битмапы


 
Зм1й ©   (2006-07-10 20:32) [9]

Спасибо, сейчас быстрее.


 
antonn ©   (2006-07-10 21:03) [10]

KilkennyCat ©   (10.07.06 8:05) [3]
у битмапов разве нет канвы?

ну автору нужно с канвасом работать, а у меня с Tbitmap. Лишнее звенья при копировании с канваса на битмап, преобразование, и вывод с битмапа на канвас...
http://kladovka.net.ru/index.cgi?pid=list&rid=252


 
KilkennyCat ©   (2006-07-10 23:53) [11]

> [10] antonn ©   (10.07.06 21:03)


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


 
antonn ©   (2006-07-11 05:32) [12]

KilkennyCat ©   (10.07.06 23:53) [11]
ну, я ж не знаю, есть ли у автора битмапы, может у него painbox и форма, и с одного на другой постоянно копируется канвас. bitblt прости только хендлы канваса, а мой пример просит битмапы (на которые нужно предварительно скопировать канвасы формы и painbox"а)


 
antonn ©   (2006-07-11 05:32) [13]


> bitblt прости

bitblt просит
:)


 
Gydvin ©   (2006-07-11 06:40) [14]


> зачем нужны преобразования...

а можно добится эфекта прозрачности?
1. Не используя дополнительные буферы (битмапы).
2. Не юзая canvas.pixels[x,y] (медлено)
3. На прямую с 1 канвы на вторую.

Если да, то как?


 
antonn ©   (2006-07-11 07:30) [15]

Gydvin ©   (11.07.06 6:40) [14]
а можно добится эфекта прозрачности?

это когда вся площать изображения просвечивает свой фон? Можно, но я делаю с буферными битмапами, без canvas.pixels[] (т.е. быстро). Канвас использую только для вывода результата, работаю напрямую с Tbitmap+scanline(). Я ссылку давал, там прозрачности с битмапами делаются.


 
Gydvin ©   (2006-07-11 10:24) [16]

как собственно и у меня )))) канвасы используются только для развязки с сабжем ))))



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

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

Наверх




Память: 0.51 MB
Время: 0.04 c
1-1150358274
def_
2006-06-15 11:57
2006.07.30
StringGrid и Hint


2-1152699659
NBU
2006-07-12 14:20
2006.07.30
Как правильно написать файл *.rtf для создания Help?


3-1148381328
HelpMe
2006-05-23 14:48
2006.07.30
Ошибка с TSocketConnection


6-1142939066
_Mike_
2006-03-21 14:04
2006.07.30
Наиболее мощный Ping-компонент.


15-1151863964
фывсссяч
2006-07-02 22:12
2006.07.30
Влияет ли питание на появление угрей