Форум: "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.47 MB
Время: 0.041 c