Главная страница
    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.48 MB
Время: 0.01 c
15-1151481375
IMHO
2006-06-28 11:56
2006.07.30
Слово об OpenOffice


9-1132456729
s3m
2005-11-20 06:18
2006.07.30
Как выводить трекерские файлы через GLScene?


2-1152173712
Ламот
2006-07-06 12:15
2006.07.30
Работа с текстовым файлом


5-1136303968
FunkyByte
2006-01-03 18:59
2006.07.30
Создание потомка TComponent с нестандартным владельцем


15-1151931225
Mozart
2006-07-03 16:53
2006.07.30
Как насчет DVD с бд форумов?





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