*.wmf nicht erkannt

Rund um die LCL und andere Komponenten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

*.wmf nicht erkannt

Beitrag von Mathias »

Ich habe ein altes Delphi-Programm konvertiert, dort habe ich mit

Code: Alles auswählen

Image1.Picture.LoadFromFile(KabelTyp + '.wmf')

wmf-Dateien eingebunden.
Sowohl unter Windows, wie Linux, kommt Format unbekannt.

Was ist die einfachste und sauberste Lösung, um diese Dateien auch mit Lazarus zu verwenden ?

Gut, ich könnte es in PNG umwandeln, aber da es sich um Linienzeichnungen handelt, will ich dies eigentlich nur zur Not machen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: *.wmf nicht erkannt

Beitrag von wp_xyz »

Soviel ich weiß, wird wmf/emf von FPC/Lazarus nicht unterstützt. In TAChart gibt es eine Windows-Only Unit (TADrawerWMF) für WMF-Export, die allerdings in the TAChart-Infrastruktur eingebunden ist, obwohl es nicht schwer sein sollte, die Klassen TMetaFile und TMetafileCanvas für allgemeine Nutzung zu extrahieren. Im Rahmen von TAChart funktioniert der Code gut (obwohl ich da nicht viel getestet habe - die Routine stammt von Alexander Klenin), und eine Standalone-Anwendung habe ich noch gar nicht probiert - hier wäre dein Pioniergeist gefragt. Aber wiegesagt, das geht nur für Windows. In http://bugs.freepascal.org/view.php?id=14333 wird eine plattformübergreifende Lösung diskutiert (siehe die dort angehängte Datei lmf.pas), aber diese Aktivität scheint eingeschlafen zu sein, auch wird auch nicht gleich den Komfort eines "Picture.LoadfromFile" haben.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.wmf nicht erkannt

Beitrag von Mathias »

Einmal vorweg, eine wmf ist keine Pixelgrafik, so wie zB. bmp/jpg.
Ich habe mich mal kurz schlau gemacht, es ist vergleichbar mit eine CAD-Zeichnen, es wird gesagt, zeichne Linie, zeichne Kreis, etc.
Wen man den genauen aufbau kennen würde, könnte man die wmf entschlüsseln.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: *.wmf nicht erkannt

Beitrag von af0815 »

Mathias hat geschrieben:Wen man den genauen aufbau kennen würde, könnte man die wmf entschlüsseln.


Lt. Wiki https://en.wikipedia.org/wiki/Windows_Metafile

Code: Alles auswählen

Die vollständige Spezifikation ist auf CD im „Microsoft Developer Network“ (MSDN) publiziert worden.


Falls du damit was machen willst, die Spezifikation ist mittlerweile hier zu finden https://msdn.microsoft.com/en-us/library/cc250370.aspx. Sind so schlaffe 200 Seiten Spez, viel Spaß :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: *.wmf nicht erkannt

Beitrag von wp_xyz »

Mathias hat geschrieben:Einmal vorweg, eine wmf ist keine Pixelgrafik, so wie zB. bmp/jpg.

Habe ich das behauptet?

Mathias hat geschrieben:Wen man den genauen aufbau kennen würde, könnte man die wmf entschlüsseln.

Z.B.:
https://winprotocoldoc.blob.core.window ... es/MS-WMF/[MS-WMF].pdf
https://www.symantec.com/avcenter/refer ... format.pdf
Viel Spaß.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: *.wmf nicht erkannt

Beitrag von MacWomble »

Mathias hat geschrieben:Gut, ich könnte es in PNG umwandeln, aber da es sich um Linienzeichnungen handelt, will ich dies eigentlich nur zur Not machen.


Ich würde diese in svg umwandeln, da wmf ein MS-internes Format ist. (z.B. mit Inkscape)

Ich glaube fpvectorial und aggpas können das verarbeiten.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

Re: *.wmf nicht erkannt

Beitrag von Martin V »

Das Windows WMF/EMF Format war nie wirklich fehlerfrei und wurde kaum von Softwareherstellern benutzt. Es ist ein Vektorgrafikformat im Sinne von "ziehe eine Linie von x0,y0 nach x1,y1 mit einer bestimmten Farbe und einer bestimmten Strichdicke; schreibe Text mit einem bestimmten Font, bestimmter Fontgröße und bestimmte Farbe an die Position x,y. Das ganze wird aber nicht allgemein formuliert wie in PS/PDF, sondern in Form von Windows API-Aufrufen. WMF ist also eine Liste von Windows-Funktionsaufrufen, um ein bestimmtes Bild zu zeichnen. Damit ist es per Definition plattform-gebunden. Es basiert auf der Win16-API (also Windows 3.0/3.1 von 1990). Es macht keinen Sinn mehr, dieses Format zu unterstützen.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: *.wmf nicht erkannt

Beitrag von wp_xyz »

Martin V hat geschrieben:WMF ist also eine Liste von Windows-Funktionsaufrufen, um ein bestimmtes Bild zu zeichnen. Damit ist es per Definition plattform-gebunden. Es basiert auf der Win16-API (also Windows 3.0/3.1 von 1990). Es macht keinen Sinn mehr, dieses Format zu unterstützen.

Das sehe ich anders. Jedem GDI-Aufruf entspricht im Prinzip eine Canvas-Methode, zumindest kann man das nachbauen. Eine normale graphische Ausgabe ist auch nichts anderes. Daher sehe ich kein Problem, die in der Datei aufgelisteten GDI-Aufrufe abzuarbeiten und auf dem Canvas auch auf Nicht-Windows-Plattformen auszugeben - es müsste sich nur jemand darum kümmern. Und bloß weil es ein altes Format ist, ist noch lange kein Grund, es zur Seite zu schieben, es gibt sicher noch Unmengen von WMF/EMF-Dateien. Das modernere svg fristet in Lazarus ein halbfertiges Nischen-Dasein (fpvectorial).

Bitschubser
Beiträge: 61
Registriert: Mo 27. Aug 2012, 15:43

Re: *.wmf nicht erkannt

Beitrag von Bitschubser »

Martin V hat geschrieben:Es macht keinen Sinn mehr, dieses Format zu unterstützen.


Das würde ich so pauschal ncht sagen.
Wenn man unter Windows progragrammiert kann es das Mittel der Wahl sein um die Zwischenablage zu füllen (wenn zum Beispiel der Benutzer den output meines Porgramms als Bild in M$-Office einbinden will) - mit wmf hat man da keine Probleme mit pixeligem Text und Treppenstufen, wo man für die Bitmap Megabytes für ansehnliche Auflösung bräuchte reichen Kilobytes...
Richtig ist allerdings, dass die Skalierung völlig kaputt ist. Hier kommt man mit trail and error eher vorwärts als wenn man die M$-Doku liest.
Interessant ist dabei, dass soweit ich feststellen konnte die Skalierung beim import in Corel-Draw "korrekter" implementiert ist als in M$-Office.

Frage in dem Zusammenhang: Was würde man unter Linux eigentlich machen wenn man eine Liniengrafik für Import in z.B. OpenOffice in die Zwischenablage schreiben will?

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: *.wmf nicht erkannt

Beitrag von MacWomble »

Bitschubser hat geschrieben:
Martin V hat geschrieben:Frage in dem Zusammenhang: Was würde man unter Linux eigentlich machen wenn man eine Liniengrafik für Import in z.B. OpenOffice in die Zwischenablage schreiben will?


SVG
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: *.wmf nicht erkannt

Beitrag von wp_xyz »

Ich habe gerade ein einfache Zeichnung in LibreOffice Draw unter Linux Mint gemacht und in die Zwischenablage kopiert. Mit meinem Clipboard-Explorer habe ich mir angesehen, was sich nun in der Zwischenablage befindet. Da ist kein SVG dabei, dafür aber - siehe da - WMF und EMF. Ich nehme daher an, dass LibreOffice durchaus WMF/EMF aus der Zwischenablage einlesen kann. Natürlich muss das eigene Programm das unter Linux auch erzeugen können.
Dateianhänge
OODrawToClipboard.png

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: *.wmf nicht erkannt

Beitrag von MacWomble »

da hatte ich was falsch verstanden. LO kann svg und wmf importieren, beim Export ist es wmf.
Da wmf aber ein propriätäres und nicht gut gepflegtes Format ist, sollte man besser das offene svg verwenden.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.wmf nicht erkannt

Beitrag von Mathias »

Ich habe mal provisorisch meine wmf in jpg umgewandelt, so läuft wenigstens das Programm.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: *.wmf nicht erkannt

Beitrag von Michl »

So ein Support würde so mancher kommerziellen Softwareschmiede gut stehen :)

Man kann mit Lazarus Trunk per fpvectorial ein WMF laden und dieses auf ein TBitmap.Canvas zeichnen lassen. Funktioniert mit den von mir getesteten WMFs super.

Danke wp_xyz !!!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.wmf nicht erkannt

Beitrag von Mathias »

Man kann mit Lazarus Trunk per fpvectorial ein WMF laden

Da ich die Trunk installiert habe, habe ich einen Ordner /usr/share/lazarus/1.7.52673/components/fpvectorial .
Nur zur Frage, wie binde ich am einfachsten die Units ein, unter Package/Installierte Packages einrichten... kann ich nichts finden.

Ich denke kaum, das ich manuelle über Project-Einstellungen/Pfade den Pfad dort eingeben muss, oder gar die Dateien raus kopieren muss.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten