Форум: "Media";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
ВнизТень на канве Найти похожие ветки
← →
Новенький (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 вся ветка
Форум: "Media";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c