Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Linien auf Canvas unterschiedlich breit dargestellt? (https://www.delphipraxis.net/170846-linien-auf-canvas-unterschiedlich-breit-dargestellt.html)

loirad 5. Okt 2012 12:18

Linien auf Canvas unterschiedlich breit dargestellt?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo liebe Community,

ich hab ein kleines Problem mit dem Canvas auf Images. Ich berechne die Breite der Linie, bzw. wie oft die Linie nebeneinander dargestellt werden soll (in einer for Schleife) so:

Delphi-Quellcode:
breite:=round((Bild.Picture.Bitmap.Width*Bild.Picture.Bitmap.Height)*2*0.0000001);
Das wird dann so gezeichnet:

Sekrechte Linien
Delphi-Quellcode:
 for i:=(<Ein bestimmter Wert>) to ((<Ein bestimmter Wert>)+breite) do
  begin
   Bild.Picture.Bitmap.Canvas.MoveTo(i,0);
   Bild.Picture.Bitmap.Canvas.LineTo(i,Bild.Picture.Bitmap.Height);
  end;
Waagerechte Linien
Delphi-Quellcode:
 for i:=(<Ein bestimmter Wert>) to ((<Ein bestimmter Wert>)+breite) do
  begin
   Bild.Picture.Bitmap.Canvas.MoveTo(0,i);
   Bild.Picture.Bitmap.Canvas.LineTo(Bild.Picture.Bitmap.Width,i);
  end;
Das Resultat ist im Anhang!

Jetzt habe ich versucht zu der Breite eine bestimmte Zahl zu addieren (z.B. 5) dann sieht es so aus, wie in dem 2. Bild im Anhang!

Wo liegt der Fehler?

Liebe Grüße
loirad

PS.: lasst euch nicht von dem roten Quadrat irritieren, das ist für dieses Problem unwichtig!

Edit: Vielleicht sollte ich noch erwähnen, dass alle 4 Linien mit der gleichen Breite aufgerufen wurden!

Helmi 5. Okt 2012 12:21

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Hallo,

ich versteh jetzt noch nicht ganz dein Problem.

Du hast die Breite um 5 Pixel erweitert und die Striche schauen dementsprechend aus - ich seh jetzt noch keinen Fehler

loirad 5. Okt 2012 12:22

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Der untere waagerechte Strich ist dünner dargestellt, als alle anderen Striche!
(Oder habe ich irgendwie einen Knick in der Optik :?:)

DeddyH 5. Okt 2012 12:25

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Wo ist denn dieser Strich im ersten Bild? Ich verstehe nicht ganz, was Du vorhast, scheint mir.

loirad 5. Okt 2012 12:28

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Er ist nicht dargestellt! Das ist ja das Problem! Vielleicht noch was zum Programm an sich:

Es ist ein Image im Formular mit der Größe 500*500. Das Bild ist größer als 500*500 und wird deshalb proportional verkleinert (über den Objektinspektor).

Helmi 5. Okt 2012 12:31

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Zitat:

Zitat von DeddyH (Beitrag 1185884)
Wo ist denn dieser Strich im ersten Bild? Ich verstehe nicht ganz, was Du vorhast, scheint mir.

Ich glaub wir brauchen beide nen Augenarzt-Termin - ich seh den nämlich auch nicht. (Brille putzen half auch nicht)

Kann es sein, dass die Breite für den unteren Strich falsch berechnet wird?
Sprich - wenn die vorgebene Breite kleiner deiner 5 z. B. ist, dann kommt als berechneter Wert ein Wert null oder kleiner raus und bei einem drauf gerechneten Wert von 5 kommt ein berechneter Wert von 3 oder was raus?

Helmi 5. Okt 2012 12:33

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Zitat:

Zitat von loirad (Beitrag 1185886)
Er ist nicht dargestellt! Das ist ja das Problem! Vielleicht noch was zum Programm an sich:

Lass dir doch mal den Wert von deiner Variablen "breite" einfach mal ausgeben (Label, ShowMessage, ...)
Vielleicht wird der ja mal null

loirad 5. Okt 2012 12:38

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Ich pack mal n Stückchen vom originalen Quelltext ran:

Delphi-Quellcode:
breite1:=round((Bild1.Picture.Bitmap.Width*Bild1.Picture.Bitmap.Height)*2*0.0000001)+5;
breite2:=round((Bild2.Picture.Bitmap.Width*Bild2.Picture.Bitmap.Height)*2*0.0000001)+5;
  if x1<x2 then
   begin
    for i:=(x2-x1) to ((x2-x1)+breite2) do
     begin
      Bild2.Picture.Bitmap.Canvas.MoveTo(i,0);
      Bild2.Picture.Bitmap.Canvas.LineTo(i,Bild2.Picture.Bitmap.Height);
     end;
   end;
  if x1>x2 then
   begin
    for i:=(x1-x2) to ((x1-x2)+breite1) do
     begin
      Bild1.Picture.Bitmap.Canvas.MoveTo(i,0);
      Bild1.Picture.Bitmap.Canvas.LineTo(i,Bild1.Picture.Bitmap.Height);
     end;
   end;
  if Bild1.Picture.Bitmap.Width-x1<Bild2.Picture.Bitmap.Width-x2 then
   begin
    for i:=(x2+(Bild1.Picture.Bitmap.Width-x1)) to ((x2+(Bild1.Picture.Bitmap.Width-x1))+breite2) do
     begin
      Bild2.Picture.Bitmap.Canvas.MoveTo(i,0);
      Bild2.Picture.Bitmap.Canvas.LineTo(i,Bild2.Picture.Bitmap.Height);
     end;
   end;
  if Bild1.Picture.Bitmap.Width-x1>Bild2.Picture.Bitmap.Width-x2 then
   begin
    for i:=(x1+(Bild2.Picture.Bitmap.Width-x2)) to ((x1+(Bild2.Picture.Bitmap.Width-x2))+breite1) do
     begin
      Bild1.Picture.Bitmap.Canvas.MoveTo(i,0);
      Bild1.Picture.Bitmap.Canvas.LineTo(i,Bild1.Picture.Bitmap.Height);
     end;
   end;


  if y1<y2 then
   begin
    for i:=(y2-y1) to (y2-y1+breite2) do
     begin
      Bild2.Picture.Bitmap.Canvas.MoveTo(0,i);
      Bild2.Picture.Bitmap.Canvas.LineTo(Bild2.Picture.Bitmap.Width,i);
     end;
   end;
  if y1>y2 then
   begin
    for i:=(y1-y2) to (y1-y2+breite1) do
     begin
      Bild1.Picture.Bitmap.Canvas.MoveTo(0,i);
      Bild1.Picture.Bitmap.Canvas.LineTo(Bild1.Picture.Bitmap.Width,i);
     end;
   end;
  if Bild1.Picture.Bitmap.Height-y1<Bild2.Picture.Bitmap.Height-y2 then
   begin
    for i:=(y2+(Bild1.Picture.Bitmap.Height-y1)) to ((y2+(Bild1.Picture.Bitmap.Height-y1))+breite2) do
     begin
      Bild2.Picture.Bitmap.Canvas.MoveTo(0,i);
      Bild2.Picture.Bitmap.Canvas.LineTo(Bild2.Picture.Bitmap.Width,i);
     end;
   end;
  if Bild1.Picture.Bitmap.Height-y1>Bild2.Picture.Bitmap.Height-y2 then
   begin
    for i:=(y1+(Bild2.Picture.Bitmap.Height-y2)) to ((y1+(Bild2.Picture.Bitmap.Height-y2))+breite1) do
     begin
      Bild1.Picture.Bitmap.Canvas.MoveTo(0,i);
      Bild1.Picture.Bitmap.Canvas.LineTo(Bild1.Picture.Bitmap.Width,i);
     end;
   end;
x1,x2,y1,y2 sind die Koordinaten von 2 Punkten (jeweils einer in einem Bild).
Und dann soll von diesen Punkten aus in alle 4 Richtungen der kleinste Abstand zur Wand gemessen werden und diese Wand in das größere Bild als Strich gemalt werden.

Helmi 5. Okt 2012 12:40

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Hast du dich durch deinen Code schon mal durchgedebuggt?
Und dir auch mal die Werte angeschaut?

loirad 5. Okt 2012 12:42

AW: Linien auf Canvas unterschiedlich breit dargestellt?
 
Eigentlich schon ...
Auch rein vom Logischen her - die Breite ist ja immer gleich breit...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz