Autor Beitrag
LeharGreen
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 12.10.03 11:00 
Hallo Ihr!

Ich bin ganz neu in diesem Forum und habe folgende Frage:

Wie kann ich eine normale Bitmap auch in Trapezform ausgeben?

Die eigentliche Bitmap liegt in rechteckiger Form vor.
Möchte Sie aber in eine Trapezform bringen.

Wo finde ich da Ansätze?

Vielen Dank an Euch.

LG
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 12.10.03 11:51 
hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure viereck(Bit: TBitmap; A,B,C,D: TPoint);
var
 x,y,x2,y2: integer;
 Bit2: TBitmap;
 Line, Line2: PRGBTriple;
begin
 Bit2 := TBitmap.Create;
 Bit2.Assign(Bit);
 Bit.Width:= max(C.X,D.X)-min(A.x,B.x);
 Bit.Height:= max(max(C.Y,D.Y), max(A.Y,B.Y));
 Bit.Canvas.FillRect(rect(0,0,Bit.Width,Bit.Height));
 for y:=0 to Bit2.Height-1 do begin
  Line:=Bit2.ScanLine[y];
  for x:=0 to Bit2.Width-1 do begin
   y2:=round((((A.Y*(1-x/Bit2.Width)+(D.Y*x/Bit2.Width)))*(1-y/Bit2.Height)) +
   (((B.Y*(1-x/Bit2.Width)+(C.Y*x/Bit2.Width)))*(y/Bit2.Height)));
   x2:=round((((A.X*(1-y/Bit2.Height)+(B.X*y/Bit2.Height)))*(1-x/Bit2.Width))+(((D.X*(1-y/ Bit2.Height)+(C.X*y/Bit2.Height)))*(x/Bit2.Width)));
   if (y2<0)or(y2>=Bit.Height)or(x2<0)or(x2>=Bit.Width) then break;   //Geändert
    Line2:=Bit.ScanLine[y2];
   inc(line2,x2);
   Line2^:=Line^;
   inc(line);
  end;
 end;
end;


eventuell musst du das bild vorher noch strecken... probier mit den punkten einfach ein bissl rum, die müssen in der richtigen reihenfolge sein.
Jenachdem wie du es benutzt musst du die fkt auch noch ein bissl verändern (die Zeilen bit.width := ... und bit.height := ...)
LeharGreen Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 13.10.03 15:23 
Titel: Ich bedanke mich.
Vielen Dank, das werde ich mal Testen.
the_immortal
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mo 05.01.04 17:32 
obbschtkuche hat folgendes geschrieben:
hier:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure viereck(Bit: TBitmap; A,B,C,D: TPoint);
var
 x,y,x2,y2: integer;
 Bit2: TBitmap;
 Line, Line2: PRGBTriple;
begin
 Bit2 := TBitmap.Create;
 Bit2.Assign(Bit);
 Bit.Width:= max(C.X,D.X)-min(A.x,B.x);
 Bit.Height:= max(max(C.Y,D.Y), max(A.Y,B.Y));
 Bit.Canvas.FillRect(rect(0,0,Bit.Width,Bit.Height));
 for y:=0 to Bit2.Height-1 do begin
  Line:=Bit2.ScanLine[y];
  for x:=0 to Bit2.Width-1 do begin
   y2:=round((((A.Y*(1-x/Bit2.Width)+(D.Y*x/Bit2.Width)))*(1-y/Bit2.Height)) +
   (((B.Y*(1-x/Bit2.Width)+(C.Y*x/Bit2.Width)))*(y/Bit2.Height)));
   x2:=round((((A.X*(1-y/Bit2.Height)+(B.X*y/Bit2.Height)))*(1-x/Bit2.Width))+(((D.X*(1-y/ Bit2.Height)+(C.X*y/Bit2.Height)))*(x/Bit2.Width)));
   if (y2<0)or(y2>=Bit.Height)or(x2<0)or(x2>=Bit.Width) then break;   //Geändert
    Line2:=Bit.ScanLine[y2];
   inc(line2,x2);
   Line2^:=Line^;
   inc(line);
  end;
 end;
end;


eventuell musst du das bild vorher noch strecken... probier mit den punkten einfach ein bissl rum, die müssen in der richtigen reihenfolge sein.
Jenachdem wie du es benutzt musst du die fkt auch noch ein bissl verändern (die Zeilen bit.width := ... und bit.height := ...)



Ich habe das ausprobiert und es hat bestens funktioniert! Kannst du mir eventuell noch ein bisschen genauer erklären was da genau abgeht? So dass ich es selbst auch begreife :)!

Gibt es eventuell eine andere Möglichkeit ein Bitmap in ein Trapez zu stauchen?

THX much