Entwickler-Ecke

Multimedia / Grafik - Bitmap in einem Trapez ausgeben


LeharGreen - So 12.10.03 11:00
Titel: Bitmap in einem Trapez ausgeben
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


Anonymous - So 12.10.03 11:51

hier:


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 - Mo 13.10.03 15:23
Titel: Ich bedanke mich.
Vielen Dank, das werde ich mal Testen.


the_immortal - Mo 05.01.04 17:32

obbschtkuche hat folgendes geschrieben:
hier:


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