Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Media";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.035 c
9-1071479588
Cibernetic
2003-12-15 12:13
2004.05.23
Omega Project JDK


3-1083237481
Felan
2004-04-29 15:18
2004.05.23
Системные переменные Interbase


14-1083507052
Vlad Oshin
2004-05-02 18:10
2004.05.23
Давайте в шахматишки срубимся


14-1083736984
@lex
2004-05-05 10:03
2004.05.23
Кто-нибудь использует методики экстремального программирования?


3-1083170401
MicroWorld
2004-04-28 20:40
2004.05.23
Фильтрация данных в IBTabl





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