Главная страница
    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.47 MB
Время: 0.01 c
6-1142589590
Volf_555
2006-03-17 12:59
2006.07.30
Как перехватить сообщение ICQ (QIP) и ответить на него?


15-1151853108
Piter
2006-07-02 19:11
2006.07.30
Как эффективнее перелезть на VS.NET?


3-1148477220
p_evghenii
2006-05-24 17:27
2006.07.30
Группировка запроса по датам


2-1152106048
ламер_13
2006-07-05 17:27
2006.07.30
как из $4d4d получить MM


3-1148455210
Бульбаш
2006-05-24 11:20
2006.07.30
Проблемы с цветом в гриде под Win98





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