Текущий архив: 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.48 MB
Время: 0.01 c