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

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

Фонарь [Delphi]


Страницы:   1 2

DM_A ©   (2004-02-29 15:35:00) 

Я хочу сделать полностью чёрную Image1. Только при направлении на неё мышью в некоем радиусе она будет светлой.Помогите пожалуйста.


TButton   (2004-03-04 03:49:00) [21]

это не массив, это пропертя, надо по ковыряться в исходниках канваса.


Vertex   (2004-03-04 00:37:00) [22]

2TButton
 так не получилось?
 делфи под рукой нет, но я так делал, должно работать
 с addr тоже не выходит?
 сам подумай, если это массив, значит элементы должны иметь адрес и его ты в любом случае получить можешь


TButton   (2004-03-03 20:56:00) [23]

кстати, камень в огород ScanLine, работает он очччень медленно, ~500мс на битмапе 256х256


TButton   (2004-03-03 05:46:00) [24]


procedure TForm1.FormCreate(Sender: TObject);
var
 x, y: integer;
begin
 bmp:=TBitMap.Create;
 bmp.Height:=256;
 bmp.Width:=256;
 for x:=0 to 255 do
   for y:=0 to 255 do
      BP[x,y]:=addr(bmp.Canvas.Pixels[x,y]);
end;

Variable required, типа конкретный пиксель это не переменная и адрес его получить не реально.


Vertex   (2004-03-03 05:41:00) [25]

2TButton сорри опечатка, ты прав


TButton   (2004-03-03 05:18:00) [26]

>BP: array of array of ^TBitmap;
может of TColor?


Vertex   (2004-03-03 03:23:00) [27]

var
 Bitmap: TBitmap;
 BP: array of array of ^TBitmap;

procedure TForm1.Create(...);
 x,y :integer;
begin
 bwidth:=...;
 bheight:=...;
 //создаем битмап нужного размера
 Bitmap:=TBitmap.Create;
 Bitmap.Width:=bwidth;
 Bitmap.Height:=bheight;

 //забиваем матрицу указателей на пиксели битмапа
 SetLength(BP,bwidth);
 for x:=0 to bwidth-1 do
 begin
   SetLength(BP,bheight);
   for y:=0 to bheight-1 do
     BP[x,y]:=@(Bitmap.Pixels[x,y]);
 end;
end;

//далее пользуемся массивом указателей если нужен прямой доступ к пикселям и битмапом для блитинга и т.д.
//моно написать процедуру типа
procedure SetPixel(x,y:integer;c:TColor);
begin
 BP[x,y]^:=c;
end;
//но если обойтись без нее не будете тратить такты на вызов
//если использовать не динамический массив то получите тоже выигрыш в скорости (обращение к элементам динамического раз в 50 медленее)
А ваще совет попробуйте fastdib - лучшее что видел в этом роде, доступ к пикселям оченььььь быстрый. Для вашей проблемы в самый раз.


nexxiss   (2004-03-02 12:36:00) [28]

>TButton
Если убрать из цикла лишние операторы присвоения и освобождение канвы перед замером времени, то должно работать побыстрее.


TButton   (2004-03-02 04:42:00) [29]

>BitBlt там же (в gdi32.dll)
я это подозревал, но не знал наверняка. DX я не пользую (в данной ситуации), но можно по подробнее про Lock, указатель и как в память на которую мне тыкнули писАть.


Asteroid   (2004-03-02 02:25:00) [30]

> TButton ©   (01.03.04 21:54) [9]
BitBlt там же (в gdi32.dll)
А если ты используешь DX, лучше вообще залочить (Lock) поверхность и рисовать напрямую (тебе будет дан указатель на память).


TButton   (2004-03-01 21:54:00) [31]

очевидно, корень проблемы в windows.SeTPixel. корни которого уходят в gdi32.dll, где и теряются. проследить корни BitBlt не удалось(( жаль, "знал бы прикуп - жил бы в Сочи"


TButton   (2004-03-01 20:57:00) [32]

в порядке эксперимента)) выяснил, что заполнение array[0..255,0..256] of TColor;занимает 3-4 мс. +~1мс на блитинг получится 4-5мс против 200 началиных, в ФПСах тоже очень красиво цифра смотрится 200-250. но! array ведь не блитнешь... или блитнешь?


TButton   (2004-03-01 20:52:00) [33]

в порядке эксперемента блитал на канву битмапу(256х256) по 1000 раз. получилось 810-870мс, т.е. 0.8-0.9мс на 1 блитинг... осталось тока разобраться с тем, как подготовить изображение для блитинга.


TButton   (2004-03-01 20:43:00) [34]

на счет скорости вывода. проведем эксперемент)))

вариант#1

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
 i, j, n, dc, z: integer;
begin
 dc:=GetDC(handle);
 z:=GetTickCount;
 for j:=0 to 255 do
   for i:=0 to 255 do
   begin
     n:=random(256);
     SetPixel(dc, i, j, RGB(n,n,n))
   end;
 ReleaseDC(handle,dc);
 z:=GetTickCount-z;
 Caption:=InttoStr(z);
end;

дает показатель 190-210(мс)
вариант#2

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
 i, j, n, dc, z: integer;
begin
 z:=GetTickCount;
 for j:=0 to 255 do
   for i:=0 to 255 do
   begin
     n:=random(256);
     Canvas.Pixels[i,j]:=RGB(n,n,n);
   end;
 z:=GetTickCount-z;
 Caption:=InttoStr(z);
end;

дает показатель 200-220

"А если не видно разницы, зачем же платить больше?"

может кто подскажет более быстрый способ? есть мысль (в зародышевой стадии), что изображение надо строить на куске памяти, а потом блитать на канву... затруднение вызывает кусок памяти, как его... вобщем какого он должен быть типа?


TButton   (2004-03-01 19:00:00) [35]

сенкс *реверанс*


MBo   (2004-03-01 06:57:00) [36]

>TButton
В Статьи загляни (для TBitmap)


Asteroid   (2004-03-01 02:07:00) [37]

> TButton ©   (29.02.04 17:08) [2]
Есть WinAPI-евский SetPixel( dc: GDC; x, y: Integer; colour: Cardinal ).


TButton   (2004-02-29 17:08:00) [38]

в догонку.
Если кто напишет полныей текст PutPixel'а буду очень признателен, бо мне ScanLine не удается понять...


TButton   (2004-02-29 16:28:00) [39]

вобщем...
PutPixel(x,y: integer; c: TColor; s: TCanvas);
begin
...
end;
сканлайном выводит пиксель на битмапу

твой вопрос:

procedure glow(x, y, r: integer; color: TColor);
var
 i, j: integer;
begin
 for i:=0 to Image1.Width do
   for j:=0 to Image1.Height do
   begin
     if SQRT((x-i)*(x-i)+(y-j)*(y-j))<=r
       then PutPixel(i,j,color,Image1.Canvas);
   end;
end;


это был вариант №1, в котором получается окружность однородного цвета, не очень интересно. поэтому переходим к варианту №2


procedure glow(x, y, r: integer; color: TColor);
var
 i, j, d, m: integer;
 r, g, b: byte;
begin
 for i:=0 to Image1.Width do
   for j:=0 to Image1.Height do
   begin
     d:=SQRT((x-i)*(x-i)+(y-j)*(y-j));
     m:=(r-d)/r;
     if m<0 then m:=0;
     r:=Round(GetRValue(color)*m);
     g:=Round(GetGValue(color)*m);
     b:=Round(GetBValue(color)*m);
     PutPixel(i,j,RGB(r,g,b),Image1.Canvas);
   end;
end;

в этом варианте рассчитывается переменная m (multiplier есси не ошибся) которая определяется как отношения расстояния от центра окружности к ее радиусу, она обеспечивает нам постепенное (равномерное) затухание от центра к краю. Задание на дом по эксперементируйте с формулой определения m. Подсказка: если затухание должно начинаться не от центра, а скажем, от середины отнимите от d половину r.


TButton   (2004-01-23 13:43:00) [40]

>Если убрать из цикла лишние операторы присвоения и освобождение
>канвы перед замером времени, то должно работать побыстрее.

:) ты так думаешь? 65536 присвоений делались за 3-4 мс(читай выше), а вобще, на данный момент вопрос стоит так: "как array of TColor блитнуть на канву"


Страницы:   1 2

Наверх

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