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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
1-1150451941
oleg444
2006-06-16 13:59
2006.07.30
Не могу отладить DLL


15-1151518964
Rial
2006-06-28 22:22
2006.07.30
Пересечение треугольников.


2-1152527956
Postalll
2006-07-10 14:39
2006.07.30
Delphi & ADO


15-1151659362
Layner
2006-06-30 13:22
2006.07.30
Сервис сам останавливается в W2003R2, хотя в 2000 стабильно


2-1152781173
Первокласник Вася
2006-07-13 12:59
2006.07.30
Как можно паковать?





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