![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фонарь [Delphi]
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 блитнуть на канву"