| Autor |
Beitrag |
LeharGreen
Hält's aus hier
Beiträge: 8
|
Verfasst: 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
|
Verfasst: 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; 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: Mo 13.10.03 15:23
Titel: Ich bedanke mich.
Vielen Dank, das werde ich mal Testen.
|
|
the_immortal
      
Beiträge: 78
|
Verfasst: 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; 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
|
|
|