Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi ganz simples Vektor-Grafikformat (https://www.delphipraxis.net/94763-ganz-simples-vektor-grafikformat.html)

_frank_ 26. Jun 2007 17:28


ganz simples Vektor-Grafikformat
 
Hallo,
ich bin am überlegen, dem DFM-Editor eine funktion bereitzustellen um Vektorgrafiken darzustellen. Diese soll benutzt werden, um unbekannte controls darzustellen.

Bedingungen:
- definition im textformat (für Speicherung in ini)
- ohne header etc.
- nur einfache Befehle wie linie, rechteck, kreis, text, farbe setzen, etc.
- relative definition (%)

ich hab mir schonmal SVG und WMF angeschaut, wobei SVG einen nicht unbedeutenden Header mitbringt, und somit der Parser ziemlich riesig ist und WMF nicht textbasiert ist.

vielleicht hat der eine oder andere sowas schonmal geschrieben, in der Forumsuche hab ich noch nichts passendes gefunden.

habe mir auch schon Gedanken (in Anlehnung an SVG und den Canvas-Methoden) gemacht, wie man sowas realisieren könnte:

Linie: LXXYYXXYY (XX,YY => zweistellige prozentuale Angaben, anfangs und Zielpunkt)
Rechteck: RXXYYXXYY
Elipse: EXXYYXXYY
Stifteigenschaften setzen: PSRGB (S=>Style/Mode,1 HexDigit pro Farbkanal, wird gedoppelt [F=>FF])
Hintergrund: BSRGB
Schriftfarbe: FSRGB

die Definition ggf. per Komma getrennt (wegen besserer Lesbarkeit und Einlesen in stringlist :) )
nur beim Text bin ich noch am grübeln, da ich sowas wie Positionierung/Ausrichtung und schriftgröße mit einbauen müsste...

TASXXYY:hier_der_text (A=>Alignment[R,C,L],S=>size[%])

vielleicht fällt jemanden eine bessere Idee an... :)

Gruß Frank

arbu man 26. Jun 2007 17:33

Re: ganz simples Vektor-Grafikformat
 
Als ich den Titel gesehen hab musst ich spontan an XML denken. Damit ließe sich die Sache leicht realisieren.

mfg, Björn

xaromz 26. Jun 2007 17:35

Re: ganz simples Vektor-Grafikformat
 
Hallo,
Zitat:

Zitat von arbu man
Als ich den Titel gesehen hab musst ich spontan an XML denken. Damit ließe sich die Sache leicht realisieren.

damit sind wir ja schon wieder bei SVG.

Gruß
xaromz

Bernhard Geyer 26. Jun 2007 17:48

Re: ganz simples Vektor-Grafikformat
 
Evtl. gleich ein Delphi-Win32-Projekt aufsetzen das XAML (jedenfalls die GUI-Beschreibung) als Beschreibung verwendet.

arbu man 26. Jun 2007 18:00

Re: ganz simples Vektor-Grafikformat
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von arbu man
Als ich den Titel gesehen hab musst ich spontan an XML denken. Damit ließe sich die Sache leicht realisieren.

damit sind wir ja schon wieder bei SVG.

Gruß
xaromz

Es muss ja nicht gleich so Komplex sein. Ein einfaches Format würde sicher auch reichen. Z.B. :
XML-Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<grafik>
  <element>
    <typ>linie</typ>
    <farbe>rot</farbe>
    <start>(0:0)</start>
    <ende>(10:10)</ende>
  </element>
</grafik>
Ließe sich einfach mit ein paar Zeilen parsen:
Delphi-Quellcode:
function StrToPoint(Str: string): TPoint;
var
  s, s1: string;
  p: integer;
begin
  s := StringReplace(Str, '(', '', []);
  s := StringReplace(s,  ')', '', []);
  p := Pos(':', s);
  s1 := Copy(s, 1, p-1);
  result.X := StrToInt(s1);
  Delete(s, 1, p);
  result.Y := StrToInt(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  s: string;
  start, ende: TPoint;
  Element: TJclSimpleXMLElems;
begin
  Refresh;
  XML.LoadFromString(Editor.Lines.Text);
  for i := 0 to XML.Root.Items.Count - 1 do begin
    Element := XML.Root.Items[i].Items;
    if Assigned(Element.ItemNamed['typ']) then begin
      if Element.ItemNamed['typ'].Value = 'linie' then begin
        if Assigned(Element.ItemNamed['farbe']) then begin
          s := Element.ItemNamed['farbe'].Value;
          if s = 'rot' then begin
            Canvas.Pen.Color := clred;
          end;
          // usw.
          // viell. html farbcodes parsen
        end;
        if
          Assigned(Element.ItemNamed['start'])and
          Assigned(Element.ItemNamed['ende'])
        then begin
          start := StrToPoint(Element.ItemNamed['start'].Value);
          ende := StrToPoint(Element.ItemNamed['ende'].Value);
          Canvas.MoveTo(start.X, start.Y);
          Canvas.LineTo(ende.X, ende.Y);
        end;
      end;
      if Element.ItemNamed['typ'].Value = 'rechteck' then begin
        //...
      end;
    end; // else Fehler behandeln
  end;
end;
Im Beispiel für das XML Mit einen TJvSimpleXMl der JEDIS verarbeitet. Okay ein richtiges Vektorformat ist es nicht aber vielleicht ein guter Anfang.

mfg, Björn

_frank_ 26. Jun 2007 18:37

Re: ganz simples Vektor-Grafikformat
 
Wie gesagt, das ganze soll ziemlich kompakt sein, da ich dies mit in meine vorhandenen (INI-) Konfigurationsdateien einbauen kann...
weiterhin möchte ich auf XML-Routinen verzichten, da mir unter D3 der entsprechende Parser fehlt bzw. diesen nachzurüsten den Nutzen übersteigt...

Gruß Frank

Bernhard Geyer 27. Jun 2007 07:15

Re: ganz simples Vektor-Grafikformat
 
1, Inidateien stoßen schnell an ihre grenzen wenn es geht gruppierte Elemente zu verwenden
2, Ein eigenes XML-Format wird schnell komplexer als man denkt da man über der laufe der Zeit immer mehr Elemente benötigt. Und wenn man sich an ein bestehendes Format (SVG) ranhängt braucht man sich neue Tags keine gedanken zu machen. Man unterstützt halt mehr Elemente. Ein Ansatz wäre evtl. das Tiny-SVG-Format das gegenüber dem "normalen" SVG-Format schon eingeschränkt ist. Für den anfang hat man halt keine 100%ige Tiny-SVG-Unterstützung.

_frank_ 20. Jul 2007 05:31

Re: ganz simples Vektor-Grafikformat
 
wen es interessiert, ich hab mal angefangen ein eigenes Format zu implementieren, um Vektor-Grafiken relativ platzsparend im Textmodus zu definieren (etwa so wie im ersten Posting).

http://www.fw-web.de/download.php?file=unknownImage.zip

vielleicht kann es noch jemand anderes gebrauchen ;)

Gruß Frank

kalmi01 20. Jul 2007 08:33

Re: ganz simples Vektor-Grafikformat
 
Moin moin,

Zitat:

Vektor-Grafiken relativ platzsparend im Textmodus zu definieren
also ob das so platzsparend ist ?
Und lesbar ist es auch nicht gerade.

Warum verwendest Du nicht vorhandenes ? Z.B. PostScript:
Delphi-Quellcode:
0 0 m       % moveto
0 200 l     % lineto
200 200 l
200 0 l
0 0 l
1 1 0 sc    % setrgbcolor
f           % fill
1 0 0 sc
50 180 m
(Hallo) show
Ist Text, ist nicht so exotisch, braucht auch nicht viel Platz.

alzaimar 20. Jul 2007 09:44

Re: ganz simples Vektor-Grafikformat
 
Da fällt mir noch HPGL ein, eine ziemlich alte Grafik-Sprache von Hewlett-Packard für ihre Plotter. Es scheint jedoch immer noch aktuell zu sein. Vielleicht ist das etwas für Dich.

PostScript ist zwar genauso gut, nur ist die zu implementierende Stack-Maschine nicht ganz so trivial, wie ein simpler HPGL-Interpreter. Das gilt allerdings nur, wenn man die gesamte Postscript-Sprache implementieren will, ansonsten nehmen die beiden Sprachen sich nicht viel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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 by Thomas Breitkreuz