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

Вниз

Как создать тень сложной формы программно   Найти похожие ветки 

 
Dima1   (2004-02-28 12:26) [0]

Мне надо вокруг обьектов сложной формы (картинки) сделать тень.
Может кто подскажет какие нибудь гототвые алгоритмы, как это делается вообще. Желательно с примерами потому что с математикой у меня на ВЫ и шопотом. :). Или ссылки плз.
Спасибо


 
Dima1   (2004-02-28 14:55) [1]

Что никто разве не знает ???


 
DeadMeat ©   (2004-02-28 16:29) [2]

Попробуй её сдвигать в противоположном направлении от тени на N пикселей, не стираяя за собой хвост... Только перед этим переделай её в чёрно-белую (или чёрно-чёрную), а потом сверху наложи реальную... Мож чё и получится...


 
Dima1   (2004-02-29 09:53) [3]

В фотошопе можно делать тень не в одну сторону, а как бы
вокруг картинки, при этом тень по сторонам получается мягкая, и визуально картинка кажется обьемной, вот и мне бы такое сделать программно. Я думаю что это не так уж сложно, просто я с таким не сталкивался. Ктонибудь это уж точно должен был делать, хотябы в тех же играх.
Тема открыта ...


 
Opilki_Inside ©   (2004-03-02 03:09) [4]

2Dima1:

Вобщем-то все очень просто...
Сам делал когда маленький был, исходники показывать не буду, потому что там ужас, а алгоритм расскажу...

у тебя есть 2 TBitmap
в одной у тебя будет храниться картинка в другой тень...

условие  - фон во круг объектов рисунка закрашен одним цветом... (например белым), что бы отличить собственно объекты от фона.

берешь свою первую картинку, копируешь на вторую при этом увеличивая.. используй CopyRect
далее пробегаешься по всем пикселям второй картинки и цвет отличный от фона заменяешь на черный...
делаешь раза 3 сглаживание...
накладываешь первую картинку на вторую, без изменения размеров, с прозрачным цветом (фоном)....

эээ... усек?:)


 
Dima1   (2004-03-02 10:18) [5]

-> Opilki_Inside
в одной у тебя будет храниться картинка в другой тень...

Ваш алгоритм требует чтобы тень уже была. А мне как раз надо ее самому сделать. В этом то все и дело. Можно сделать уже готовые картинки с тенью в фотошопе и не мучатся с копированием в этом случае. Но мне это не подходит. Надо программно..
Может кто еще что предложит?


 
vgb ©   (2004-03-02 12:00) [6]

2 Dima1

> в одной у тебя будет храниться картинка в другой тень...
>
> Ваш алгоритм требует чтобы тень уже была.


Перечитай еще раз

> Opilki_Inside ©   (02.03.04 03:09) [4]
:)))


 
Opilki_Inside ©   (2004-03-02 13:37) [7]

эээх.. ну как дети малые.... вот написал, смотри... :)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

type
 tRGb = record
   b,g,r:byte;
 end;
 argb=array [0..1] of trgb;
 prgb=^argb;

var
 Form1: TForm1;
 bt:TBitmap;

procedure MakeShadow(bitmap:tBitmap);

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 bt:=tBitmap.Create;
 bt.PixelFormat:=pf24bit; //Обязательно (!!) указываем количество цветов
 bt.Width:=400;
 bt.Height:=300;

 //рисуем какие-то объекты...
 bt.Canvas.Brush.Color:=$FFFFFF;
 bt.Canvas.Rectangle(0,0,bt.Width,bt.Height);
 bt.Canvas.Brush.Color:=$AAFF33;
 bt.Canvas.Rectangle(20,30,90,130);
 bt.Canvas.Ellipse(200,40,300,160);
 bt.Canvas.Font.Size:=20;
 bt.Canvas.Font.Color:=$8888FF;
 bt.Canvas.Brush.Color:=$FFFFFF;
 bt.Canvas.Font.Name:="Arial";
 bt.Canvas.TextOut(40,200, "Simple text");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 MakeShadow(bt);
 canvas.draw(5,5,bt);
end;

procedure MakeShadow(bitmap:tBitmap);
var
 bit1:tBitmap;
 p,p0,p1:prgb;
 x,y,n:integer;
begin
 try
   //создаем битмап, в котором нарисуем тень
   bit1:=TBitmap.Create;
   bit1.PixelFormat:=bitMap.PixelFormat;
   bit1.Width:=bitmap.Width;
   bit1.Height:=bitmap.Height;

   //копируем с увеличением
   bit1.Canvas.CopyRect(Rect(0,0,bitmap.Width,bitmap.Height),bitmap.Canvas,rect(-5,-5,bit1.Width+5,bit1.Height+5));

   //заменяем все цвета на черный... цвет тени... (а можно окрасить тень в другой цвет)
   for y:=0 to bit1.Height-1 do
   begin
     p:=bit1.ScanLine[y];
     for x:=0 to bit1.Width-1 do
     begin
       //если цвет НЕ белый, тогда заменяем его на черный
       if not ((p[x].r=255) and (p[x].g=255) and (p[x].b=255)) then
       begin
         p[x].r:=0;
         p[x].g:=0;
         p[x].b:=0;
       end;
     end;
   end;

   //делаем сглаживание тени
   //суть сглаживания состоит в усрднении каждого компонента цвета для соседних пикселей
   for n:=0 to 2 do
   for y:=1 to bit1.Height-2 do
   begin
     p0:=bit1.ScanLine[y-1];
     p:=bit1.ScanLine[y];
     p1:=bit1.ScanLine[y+1];
     for x:=1 to bit1.Width-2 do
     begin
       p[x].r:=(p[x-1].r+p[x+1].r+p0[x].r+p1[x].r) shr 2;
       p[x].g:=(p[x-1].g+p[x+1].g+p0[x].g+p1[x].g) shr 2;
       p[x].b:=(p[x-1].b+p[x+1].b+p0[x].b+p1[x].b) shr 2;
     end;
   end;

   //накладываем нашу картинку с объектами на только что созданную тень
   for y:=0 to bit1.Height-1 do
   begin
     p0:=bit1.ScanLine[y];
     p:=bitmap.ScanLine[y];
     for x:=0 to bit1.Width-1 do
     begin
       //если цвет НЕ белый, тогда копируем пиксель
       if not ((p[x].r=255) and (p[x].g=255) and (p[x].b=255)) then
       begin
         p0[x].r:=p[x].r;
         p0[x].g:=p[x].g;
         p0[x].b:=p[x].b;
       end;
     end;
   end;

   bitmap.Canvas.Draw(0,0,bit1);

 finally
   bit1.Free;
 end;
end;

end.


 
Dima1   (2004-03-04 10:29) [8]

-> Opilki_Inside.
Я действительно не внимательно прочитал.
Ну, что тут скажешь.... Тормоз, он и есть тормоз... :))

Все нормально получилось. Так как я и хотел.
Спасибо вам большое за помощь.
Тема закрыта.



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

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

Наверх




Память: 0.49 MB
Время: 0.048 c
14-1083310917
Ditrix
2004-04-30 11:41
2004.05.23
недостатки MSSQL


3-1083158365
Stupid
2004-04-28 17:19
2004.05.23
SQL c Null


6-1081331309
NorthMan
2004-04-07 13:48
2004.05.23
Народ, в сети гуляет пример реализации PING а в Delphi


3-1082804326
Кирилл Негодов
2004-04-24 14:58
2004.05.23
Вычисляемые поля.


1-1083737382
mr. Faga
2004-05-05 10:09
2004.05.23
Формат RES файлов