Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.30;
Скачать: CL | DM;

Вниз

Тень на канве   Найти похожие ветки 

 
Новенький   (2006-02-08 18:45) [0]

Доброго вечера.

Как нарисовать на TCanvas полупрозрачную тень или может быть градиентную?


 
antonn ©   (2006-02-08 19:20) [1]

тень от чего?


 
Новенький   (2006-02-08 20:04) [2]

Вывожу картинку(фото), хотелось бы сделать вокруг плавную тень.


 
Gorger ©   (2006-02-09 07:01) [3]

Если просто вокруг прямоугольного изображения, то скачай какую нибудь библиотеку для работы с PNG, создавай полупрозрачный PNG (можно с плавными переходами; для этого изучи градиенты), и отрисовывай его на TCanvas.


 
ancara ©   (2006-02-09 10:48) [4]

Еще был бы неплохой эффект, если бы удалось нарисовать сначало черный прямоугольник размером с фото, но немного сместив вправо и вниз (это если воображаемый свет светит слева-сверху). Затем размыть его, скажем, по Гауссу, а потом поверх нарисовать непосредственно само фото. Тень получается очень приличная, в фотошопе, по крайней мере. А что мешает сделать то же самому?
Только вот насчет Гаусса посоветовать ничего немогу, не писал его еще... Спрашивай, может у кого готовая процедурка есть...


 
ancara ©   (2006-02-09 11:13) [5]

Что-то я не о том подумал, после прочтения вопроса, для тебя размытие, видимо, не так важно, ты говоришь полупрозрачную тень или градиентную?

Ну с полупрозрачной проблем нет, все просто:
- выбираем коэффициентпрозрачности, скажем 0.3
- берем цвет пикселя фона: (R1, G1, B1) умножаем на 1-0.3=0.7 каждую
компоненту: (0.7*R1,   0.7*G1,   0.7*B1)
- берем цвет пикселя тени (R2, G2, B2) умножаем на 0.3 каждую
компоненту: (0.3*R2,   0.3*G2,   0.3*B2)
- затем складываем покомпонентно эти два цвета и имеет результирующий цвет
пикселя, который затем рисуем: (0.7*R1+0.3*R2,   0.7*G1+0.3*G2,   0.7*B1+0.3*B2)

Градиентная еще проще:
- по мере удаления от края фотографии коэффициент уменьшается до нуля
- только на углах будут артефакты, а от них поможет опять же Гаусс....


 
ancara ©   (2006-02-09 11:55) [6]

во, нашел Гаусса: http://www.delphirus.net.ru/topic2.html


 
Новенький   (2006-02-09 13:40) [7]

Спасибо, попробую. Там даже пример есть.


 
programania ©   (2006-02-09 18:47) [8]


//рисование тени от текста или прямоугольника
{$R-,B-,S-}
program ten;
uses windows, graphics, sysutils, classes;

PROCEDURE teni(
c:     tCanvas;  //где рисовать
xn,yn: integer;  //откуда начинать
wt,ht: integer;  //если не 0 то прямоугольник с этой шириной и высотой
text:  string;   //текст
ct:    integer;  //цвет текста, прямоугольника, -1 не заполнять
rt:    integer;  //размер текста, для прямоугольника закругления углов
st:    integer;  //размытие тени 0..32
xs,ys: integer;  //смещение тени вправо, вниз
pl:    integer); //плотность тени 0..100

type
tm=array[0..1000,0..1200{Это макс.размер тени}] of byte;

var
b:  tBitmap;
m,t,tt: ^tm;
j,w,h,x,y,xx,yy,r,x1,x2,x3,c1,c2,c3,k,rm,st2: integer;
s : pbytearray;
c4: array[1..4] of byte absolute ct;
pr: boolean; //прямоугольник
z:  boolean; //заполнять текст прямоугольник

begin
b:=Graphics.tBitMap.create; b.pixelformat:=pf24bit;
rm:=sizeOf(tm);
getMem(m,rm);
getMem(t,rm);
getMem(tt,rm);
pr:=(wt>0)and(ht>0);
z:=ct>=0;

with b.canvas do begin
//Вывод текста, прямоугольника в bitmap
 brush.color:=$FFFFFF;
 if pr then begin w:=wt; h:=ht end
 else begin
   font.name:="Times new roman";
   font.size:=rt;
   font.color:=0;
   font.style:=[fsBold];
   w:=textWidth(text);
   h:=textHeight(text);
 end;

 inc(w,st*4);
 inc(h,st*4);
 b.width:=w;
 b.height:=h;
 st2:=st*2;
 if pr then begin brush.color:=$0; roundRect(st2,st2,wt+st2,ht+st2,rt,rt) end
       else TextOut(st2,st2,text);
end;

//вывод текста из bitmap в массив m
for y:=0 to h-1 do begin
 s:=b.scanLine[y];
 x1:=0;
 for x:=0 to w-1 do begin m^[y,x]:=s[x1]; inc(x1,3) end;
end;

//Размытие текста в массиве tt
move(m^,t^,rm);
fillChar(tt^,rm,255);
for j:=1 to st do begin
 for y:=st to h-st do for x:=st to w-st do begin
   r:=0;
   for yy:=y-1 to y+1 do for xx:=x-1 to x+1 do inc(r,t^[yy,xx]);
   tt^[y,x]:=r div 9;
 end;
 move(tt^,t^,rm);
end;

//вывод тени в bitmap
b.canvas.copyRect(rect(0,0,w,h),c,rect(xn,yn,xn+w,yn+h));
for y:=ys to h-1 do begin
 s:=b.scanLine[y];
 x1:=xs*3; x2:=x1+1; x3:=x2+1;
 for x:=xs to w-1 do begin
   if m[y,x]<255 then begin
     if z then begin c1:=c4[1]; c2:=c4[2]; c3:=c4[3] end
          else begin c1:=s[x1]; c2:=s[x2]; c3:=s[x3] end
   end
   else begin
     k:=255-(255-t^[y-ys,x-xs]) * pl div 100;
     c1:=s[x1] * k div 255;
     c2:=s[x2] * k div 255;
     c3:=s[x3] * k div 255;
   end;
   s[x1]:=c1;  s[x2]:=c2;  s[x3]:=c3;
   inc(x1,3);  inc(x2,3);  inc(x3,3);
 end;
end;

//вывод bitmap на canvas
c.draw(xn,yn,b);
b.free;
freeMem(m);
freeMem(t);
freeMem(tt);
end;

var ce:tCanvas;

begin
ce:=tCanvas.create;
ce.Handle:=GetDC(0);
teni(ce,50, 60, 400,200,"",     $AAAAFF,20, 24,10,10,60);
teni(ce,130,130,0,  0,  "ТЕНЬ", $FF0000,72,6, 4, 4, 100);
teni(ce,120,300,0,  0,  "ТЕКСТ",$FFCC88,96,6, 6, 6, 100);
end.


 
Fenik ©   (2006-02-10 00:29) [9]

> Gorger ©  (09.02.06 07:01) [3]

Хуже совета не придумаешь..



Страницы: 1 вся ветка

Текущий архив: 2006.07.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
2-1152454547
Зм1й
2006-07-09 18:15
2006.07.30
Canvas


3-1148903751
ttt_111
2006-05-29 15:55
2006.07.30
Работа с DBGrid.


2-1152188298
FFFF
2006-07-06 16:18
2006.07.30
В запросе не работает "NZ"


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


2-1152699659
NBU
2006-07-12 14:20
2006.07.30
Как правильно написать файл *.rtf для создания Help?