Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Koordinatensystem in TImage (https://www.delphipraxis.net/1186-koordinatensystem-timage.html)

sam24 29. Okt 2002 16:58


Koordinatensystem in TImage
 
Hallo an alle,

eigentlich hat es trivial geklungen. Ich will ein Koordinatensystem in einem TImage zeichnen (MoveTo, LineTo). Funktioniert auch. Als Hilfslinien sind mir die Linien allerdings etwas zu dick. Wenn ich das image dann auch noch vergrößere, werden die Linien heftig dick. Ich habe bisher mit folgenden Einstellungen keinen Erfolg gehabt.

Code:
  Image1.Canvas.Pen.Style := PsDot;
  Image1.Canvas.Pen.Width := 1;
  Image1.Canvas.Pen.Color := ClBlack;
  Image1.Canvas.Font.Size := 4;
  Image1.Picture.Bitmap.Width := ClientWidth;
  Image1.Picture.Bitmap.height := ClientHeight;
Muß doch eigentlich irgendwie einfach gehen.

Danke

Sebastian Nintemann 29. Okt 2002 18:30

Hallo!

Also, was ist jetzt das Problem? Das Größe ändern?
Und was meinst du mit Hilfslinien? Um das dicker werden beim vergrößern (oder möglicherweise das verschwinden von Teilen deines Koordinatensystems beim verkleinern) zu verhindern wirst du wohl nicht drumrum kommen beim neu zeichnen des TImage (also beim OnPaint) die Achsen jeweils neu zu zeichnen, und beim größe ändern dann neu zu zeichnen (OnPaint dürfte dann eh ausgelöst werden). Wenn du das Koordinatensystem auch noch über ein geladenes Bild zeichnen willst, musst du dieses wohl auch jedesmal neu auf das TImage zeichnen. Du hast also ein TBitmap mit deiner Graphik im Speicher, und beim OnPaint zeichnest du es auf das Canvas, und danach das Achsensystem. Dafür würde ich dir allerdings eine TPaintBox empfehlen.
Meld dich einfach bei Fragen oder wenn ich hier was falsch verstanden hab :mrgreen:

Gruß, Sebastian

sam24 30. Okt 2002 09:19

Hallo GrotesQuery,

das Problem besteht schon im ersten Zeichnen des Koordinatensystems. Die Linien werden einfach viel zu dick. Ich habe bislang keine Lösung gefunden, dünne Linien zu erzeugen. Das Vergrößern ist eigentlich nur das Folgeproblem.

Gruß Sam24

Christian Seehase 30. Okt 2002 09:39

Moin Sam,

da Du mit Pen.Width die Stiftbreite in Pixel setzt, und Du, zumindest in Deinem Beispielcode, hier den Wert 1 eingetragen hast, wird keine schmalere Linie möglich sein.
Weniger als ein Pixel Breite geht nicht.

DrDangerous 30. Okt 2002 09:50

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Sam,

wie Christrian schon sagte, Linienbreiten unterhalb 1 Pixel wirst Du nicht schaffen können. Du kannst allenfalls die Farbe der Linien anpassen, so dass sie rein optisch weniger ins Gewicht fallen; zum Beispiels durch Verwendung eines Grautones.

Ich habe mal mit folgendem Code ein Raster auf ein Bild gemalt. Vielleicht kannst Du anhand dieses Beispiels erklären, was daran jetzt noch zu dick ist.
(Es geht mir im Moment weniger um die nicht vorhandene Eleganz dieses Codes... also bitte nicht meckern..)

Code:
[b]procedure[/b] TForm1.btn_DrawGridClick(Sender: TObject);
[b]const[/b] GridSize : Integer = 20;
[b]var[/b] xSteps, ySteps, xIndex, yIndex : Integer;
[b]begin[/b]
  [b]If not[/b] Image1.Picture.Bitmap.Empty [b]Then[/b]
    [b]With[/b] Image1.Picture.Bitmap [b]Do[/b]
    [b]Begin[/b]
      xSteps:= Width [b]div[/b] GridSize;
      ySteps:= Height [b]div[/b] GridSize;

      [b]With[/b] Canvas [b]Do[/b]
      [b]Begin[/b]

        Pen.Width:= 1;
        Pen.Color:= clSilver;
        Pen.Style:= psSolid;

        [b]For[/b] xIndex:= 0 [b]To[/b] xSteps [b]Do[/b]
          [b]For[/b] yIndex:= 0 [b]To[/b] ySteps [b]Do[/b]
          [b]Begin[/b]
            MoveTo( 0, yIndex*GridSize ); LineTo( Width, yIndex*GridSize );
            MoveTo( xIndex*GridSize, 0 ); LineTo( xIndex*GridSize, Height );
          [b]End;[/b]
      [b]End;[/b]
    [b]End[/b]
  [b]Else[/b]
    ShowMessage( 'Kein Bild verfügbar.' );
[b]end;[/b]
Das von diesem Code produzierte Bild siehst Du im Anhang. Wenn man dieses jetzt mitsamt des Gitters vergrößert, so werden die Linien natürlich ebenfalls größer (breiter). Als Abhilfe könntest Du jeweils das Original skalieren und erst danach das Gitter zeichnen. Die Operation geht recht schnell und Du bist wieder bei Linienbreiten von genau 1 Pixel.

sam24 30. Okt 2002 14:57

Danke an alle, das wars.

Kurz zur Erkärung: Ich habe auf den Canvas des Image gemalt. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 Uhr.

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