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

Вниз

Как наложить 3 изображения одно на другое?   Найти похожие ветки 

 
greenrul ©   (2003-05-18 00:04) [0]

Есть a:TImageSprite, который создается динамически. Есть картинки, "1","2","3" - как в этот спрайт загнать эти 3 картинки наложив одну на другую? Пробую:



a:=TImageSprite.Create(SpriteEngine.engine); {обратите внимание - спрайт создается в runtime - может у меня из-за этого баги?}
for i:=1 to 3 do
begin
( IntToStr(i)
Есть a:TImageSprite, который создается динамически. Есть картинки, "1","2","3" - как в этот спрайт загнать эти 3 картинки наложив одну на другую? Пробую:



a:=TImageSprite.Create(SpriteEngine.engine); {обратите внимание - спрайт создается в runtime - может у меня из-за этого баги?}
for i:=1 to 3 do
begin
a.image:=Images.items.find(IntToStr(i));
a.x:=10;
a.y:=10;
a.z:=10;
a.width:=a.image.width;
a.height:=a.image.height;
a.image.transparent:=true;
a.image.transparentcolor:=clRed;
a.visible:=true
end;



Отображается ТОЛЬКО последний слой... Заранее прошу не предлагать метод склеивания картинок через TCanvas, так как убедительно считаю его тормозным для кучи тайлов.


 
Проходил мимо...   (2003-05-18 00:48) [1]

А почему должны отображаться другие...
В а копируется последнее изображение и никаких слоев тут нет, так что прийдется поработать ручками и сделать какое нибудь подобие blender"а, напримет изображения загружать в TBitmap и проводить "сложнейшие операции" по смешиванию картинок, другого пути видимо нет.


 
greenrul ©   (2003-05-18 15:05) [2]

Пример неработающей процедуры:

function CombineImages(a1,a2:string):TPicture;
var b1,b2,b3:TBitmap;
( a1)
Пример неработающей процедуры:

function CombineImages(a1,a2:string):TPicture;
var b1,b2,b3:TBitmap;
b:TPicture;
begin
b1:=TBitmap.Create;
b2:=TBitmap.Create;
b3:=TBitmap.Create;
b:=TPicture.Create;
b1:=MainForm.images.Items.Find(a1).Picture.bitmap;
b1.Width:=MainForm.images.Items.Find(a1).Picture.width;
b1.Height:=MainForm.images.Items.Find(a1).Picture.height;
b2:=MainForm.images.Items.Find(a2).Picture.bitmap;
b2.Width:=MainForm.images.Items.Find(a2).Picture.width;
b2.Height:=MainForm.images.Items.Find(a2).Picture.height;
b2.Transparent:=True;
b3.Width:=b2.Width;
b3.Height:=b2.Height;
b3.Canvas.Draw(0,0,b1);
b3.Canvas.Draw(0,0,b2);
b.Assign(b3);
CombineImages:=b;
b1.free;
b2.free;
b3.free;
b.free;
end;


Вызываю -
Tiles[xx,yy]:=TImageSprite.Create(MainForm.DXSpriteEngine1.Engine);
Tiles[xx,yy].Clear;
Tiles[xx,yy].Image.Picture:=CombineImages("606","607"); {Здесь вылетает error}
Tiles[xx,yy].z:=...
Tiles[xx,yy].Width:=...
Tiles[xx,yy].Height:=...
Tiles[xx,yy].x:=...
Tiles[xx,yy].y:=...
Tiles[xx,yy].Image.Transparent:=true;
Tiles[xx,yy].Image.TransparentColor:=clRed;
Tiles[xx,yy].Visible:=true;
Tiles[xx,yy].PixelCheck:=false;



Где я ошибся?


 
Agent[007] ©   (2003-05-18 21:32) [3]

мне кажется, что надо 3 переменных: a, b, c; и тогда они наложаться... :)))


 
greenrul ©   (2003-05-18 21:36) [4]

Но выходные данные должны быть - TImage - у меня работал пример:

b1:=TBitmap.Create;
b2:=TBitmap.Create;
b3:=TBitmap.Create;

b1.LoadFromFile("c:\1.bmp");
b2.LoadFromFile("c:\2.bmp");

b2.Transparent:=True;

b3.Width:=b1.Width; b3.Height:=b1.Height;
b3.Canvas.Draw(0,0,b1);
b3.Canvas.Draw(0,0,b2);

Pict.Assign(b3);

b1.free;
b2.free;
b3.free;


 
cyborg ©   (2003-05-18 21:57) [5]

Как всё запущено...

Задания для размышления:

1. Ты уверен, что MainForm.images.Items.Find(a1).Picture.bitmap; всегда будет находить твой а1?
Если не находит, то что произойдёт?

2. CombineImages:=b; b.free; Какое значение имеет Result и что получается в итоге?

И вопрос интересующий меня :):
Зачем ты копируешь три картинки в одну?


 
greenrul ©   (2003-05-18 21:58) [6]

Прошу прощения, немного наглючил, но все равно НЕ РАБОТАЕТ:
вызов :
Tiles[xx,yy].Image.Picture.Assign(CombineImages("606","607"));

сама процедура:
function CombineImages(a1,a2:string):TBitmap;
var ( a1)
Прошу прощения, немного наглючил, но все равно НЕ РАБОТАЕТ:
вызов :
Tiles[xx,yy].Image.Picture.Assign(CombineImages("606","607"));

сама процедура:
function CombineImages(a1,a2:string):TBitmap;
var b1,b2,b3:TBitmap;
begin
b1:=TBitmap.Create;
b2:=TBitmap.Create;
b3:=TBitmap.Create;

b1:=MainForm.images.Items.Find(a1).Picture.bitmap;
b1.Width:=MainForm.images.Items.Find(a1).Picture.width;
b1.Height:=MainForm.images.Items.Find(a1).Picture.height;

b2:=MainForm.images.Items.Find(a2).Picture.bitmap;
b2.Width:=MainForm.images.Items.Find(a2).Picture.width;
b2.Height:=MainForm.images.Items.Find(a2).Picture.height;

b2.Transparent:=True;

b3.Width:=b2.Width;
b3.Height:=b2.Height;

b3.Canvas.Draw(0,0,b1);
b3.Canvas.Draw(0,0,b2);

CombineImages:=b3;

b1.free;
b2.free;
b3.free;
end;


 
greenrul ©   (2003-05-18 22:01) [7]

1. Уверен.
2. Access violation at 00000038 accessing 00000038
не очень понимаю как узнать result, если такая фигня творится.

3. Не три, а две - у меня несколько слоев для тайловой карты, хочу совместить в один


 
greenrul ©   (2003-05-18 22:29) [8]

Удивительно - делаю b3.savetofile - сохраняется нормально...
очень странно - ведь передаю TBitmap, получаю Picture.Bitmap:=Result...


 
cyborg ©   (2003-05-18 22:52) [9]

CombineImages:=b3; и есть Result:=b3;;

1. А я бы на твоём месте небыл бы так уверен, хотя тебе виднее.

2. опять же делаешь CombineImages:=b3; b3.free;

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



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

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

Наверх




Память: 0.49 MB
Время: 0.024 c
6-79091
VadimEagle
2003-09-26 23:29
2003.11.24
Socket


7-79197
Staryker
2003-09-08 21:51
2003.11.24
Как сделать чтобы комп не выключался?


3-78780
Dmitriy O.
2003-11-05 16:44
2003.11.24
Как удалить все записи в таблице TADOTable


8-79056
Kaylang
2003-07-28 16:07
2003.11.24
Необходимо сделать цветное фото монохромным


1-78949
R
2003-11-12 04:08
2003.11.24
Оптимальность и целесообразность применения констант