Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Laden eines .webp Bildes? (https://www.delphipraxis.net/210949-laden-eines-webp-bildes.html)

softtouch 4. Jul 2022 11:18

Laden eines .webp Bildes?
 
Ich muss einige .webp Bilder laden und als jpeg speichern, und das unter FMX.
Leider habe ich bisher keine Weg gefunden, dies zu bewerkstelligen ohne irgendwelche externen dll oder dylib.
Hat jemand vielleicht eine Idee wie ich dies realisieren kann, ohne eine Abhängigkeit von externen Komponenten?

Sinspin 4. Jul 2022 12:07

AW: Laden eines .webp Bildes?
 
Die webp-est, oder google kann alles besser Pest.
Wenn ich die englischen Wikipedia Einträge dazu richtig verstanden habe dann gibt es von google seite eine Referenz Implementierung. Um den Rest muss man sich selber kümmern.
Da es aber schon seit Jahren von vielen Programmen unterstüzt wird sollte da auch Freeware existieren die du zur Not erstmal verbauen oder verwenden könntest.
Als Fan von IrfanView ist dieses für mich das Mittel der Wahl.

HolgerX 4. Jul 2022 12:44

AW: Laden eines .webp Bildes?
 
Hmm..

ich habe vor Jahren mal mit WebP gebastelt und damit einen Wraper für TBitmap (VCL) erstellt.

Damit konnte ich das .webp laden/speichern unter Verwendung der libwebp.dll.

Dieses Bitmap kann dann einem jpeg zugewiesen werden und somit ein jpeg von einem webp erzeugt werden.
Ob dieses mit dem TBitmap von FMX funktionniert, weiß ich nicht...

Wenn du die Lösung als Beispiel haben willst, dann kann ich es ja mal hochladen, alternativ google mal danch Delhi und libwebp.dll...

(ist halt bei mir nur eine rudimentäre Bastelarbeit, die irgendwie funktioniert ;) )

MyRealName 4. Jul 2022 12:46

AW: Laden eines .webp Bildes?
 
Hier gibt es eine Bibliothek : https://github.com/Wykerd/delphi-webp
Sind auch Beispiele da, die Dir zeigen, wie es geht

softtouch 4. Jul 2022 12:48

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von MyRealName (Beitrag 1508309)
Hier gibt es eine Bibliothek : https://github.com/Wykerd/delphi-webp
Sind auch Beispiele da, die Dir zeigen, wie es geht

Danke, das ist leider nur VCL. Ich muss eine Crossplatform Lösung finden (Windows, Mac, Linux, Android etc.), somit suche ich nacheiner reinen Pascal Lösung ohne externe Abhängigkeiten.

HolgerX 4. Jul 2022 12:53

AW: Laden eines .webp Bildes?
 
Hmmm..

Zitat:

Zitat von softtouch (Beitrag 1508310)
Zitat:

Zitat von MyRealName (Beitrag 1508309)
Hier gibt es eine Bibliothek : https://github.com/Wykerd/delphi-webp
Sind auch Beispiele da, die Dir zeigen, wie es geht

Danke, das ist leider nur VCL. Ich muss eine Crossplatform Lösung finden (Windows, Mac, Linux, Android etc.), somit suche ich nacheiner reinen Pascal Lösung ohne externe Abhängigkeiten.



Ich denke ohne libwebp Lib wird es nicht gehen, es gibt keine 'reine' Pascal Implementation.
unter
https://github.com/bgrabitmap/webp

ist eine Lazarus Version, zumindestens für Win32/64/Unix....

Sinspin 4. Jul 2022 13:20

AW: Laden eines .webp Bildes?
 
Die Lib selber kann man laut google für verschiedene Plattformen übersetzen. (Es gibt schon fertiges für Linux, Windows and macOS)
WEBP Sources
Du musst dann nur pro Plattform sehen welche lib du verwedest.

Ich glaube nicht das sich jemand antut alles nach Pascal zu übersetzen und es aktuell zu halten.

himitsu 4. Jul 2022 14:27

AW: Laden eines .webp Bildes?
 
Als .obj kompiliert, zusammen mit einer Pascal-Header-Unit (ähnlich einer Unit für DLL-Imports),
ließe es sich auch in die EXE einkompilieren linken.

siehe z.B. ZLib/Zip, Jpeg, PNG und RegEx im Delphi.

Sinspin 4. Jul 2022 14:40

AW: Laden eines .webp Bildes?
 
Geht das Multiplattform? Ich habe .lib mal verwendet um V2M Dateien abspielen zu können. Aber nur unter Windows 32. Ich denke nicht das das einfach so für 64Bit / Linux / ARM geht.

himitsu 4. Jul 2022 15:12

AW: Laden eines .webp Bildes?
 
Je nach Platform braucht man eine andere "LIB",
da Diese ja vorkompiliert sind und demnach nur für je eine Platform möglich sind.


Also ob man das statisch oder dynamisch linkt (gegen eine DLL/Library-Datei)
oder ob man das in die Anwendung einkompilier/linkt (den Code importiert).

Teilweise gibt es in einigen OS bereits etwas, was man direkt verwenden kann.
z.B. denke ich mal, dass webp im Android enthalten sein wird und man da Funktionen via Java aufrufen könnte.

bekanntes Beispiel: im Windows greift man direkt auf die Webcam zu und nutzt irgendeine Barcode-Lib,
aber im Android/iOS könnte man auch eine Action der Camera-App ansprechen und sich von ihr den Barcode geben lassen.

z.B.
hier wird nur für Win32 oder Win64 etwas "in die EXE gelinkt", während bei den anderen Compilern nur gegen eine entsprechende LIB ge-/verlinkt wird (welche vermutlich von Delphi mitgegeben wird).
Zitat:

Delphi-Quellcode:
{$IFDEF MACOS}
  {$IF defined(CPUARM)}
    {$IFDEF IOS}   //IOS devices
    PU = '';
    LIBPCRE = 'libpcre.a';
    {$DEFINE STATIC_LIB}
    {$ELSE}        //OSX
    PCRELib = '/usr/lib/libpcre.dylib';
    {$DEFINE DYNAMIC_LIB}
    {$ENDIF}
  {$ELSE}
    {$IFDEF IOS}   //IOS Simulator
    PCRELib = 'libpcre.dylib';
    {$ELSE}        //OSX
    PCRELib = '/usr/lib/libpcre.dylib';
    {$ENDIF}
    {$DEFINE DYNAMIC_LIB}
  {$ENDIF}
{$ENDIF MACOS}
{$IFDEF LINUX}
  PU = '';
{$IFDEF PIC}
  LIBPCRE = 'libpcre_PIC.a';
{$ELSE PIC}
  LIBPCRE = 'libpcre.a';
{$ENDIF PIC}
  {$DEFINE STATIC_LIB}
{$ENDIF LINUX}
{$IFDEF MSWINDOWS}
  {$IFDEF CPUX86}
  PU = '_';
  {$ELSE}
  PU = '';
  {$ENDIF}
{$ENDIF}
{$IFDEF ANDROID}
  PU = '';
  LIBPCRE = 'libpcre.a';
  {$DEFINE STATIC_LIB}
{$ENDIF ANDROID}
{$IFDEF PCRE16}
  PCREname = 'pcre16_';
{$ELSE}
  PCREname = 'pcre_';
{$ENDIF}
{$EXTERNALSYM PCREname}

{$IFDEF NEXTGEN}
 {$NODEFINE pcre_study}
 {$NODEFINE pcre_compile}
 {$NODEFINE pcre_compile2}
{$ENDIF}

...

{$IF Declared(PCRELib)}
var
  _PCRELib: THandle;
{$ENDIF}

{$IFDEF MSWINDOWS}
  {$IFDEF PCRE16}
    {$IF Defined(Win32)}
      {$L pcre16_study.obj}
      {$L pcre16_compile.obj}
      {$L pcre16_config.obj}
      {$L pcre16_dfa_exec.obj}
      {$L pcre16_exec.obj}
      {$L pcre16_fullinfo.obj}
      {$L pcre16_get.obj}
      {$L pcre16_maketables.obj}
      {$L pcre16_newline.obj}
      {$L pcre16_ord2utf16.obj}
      {$L pcre16_refcount.obj}
      {$L pcre16_tables.obj}
      {$L pcre16_string_utils.obj}
      {$L pcre16_ucd.obj}
      {$L pcre16_valid_utf16.obj}
      {$L pcre16_version.obj}
      {$L pcre16_xclass.obj}
      {$L pcre16_default_tables.obj}
    {$ELSEIF Defined(Win64)}
      {$L pcre16_study.o}
      {$L pcre16_compile.o}
      {$L pcre16_config.o}
      {$L pcre16_dfa_exec.o}
      {$L pcre16_exec.o}
      {$L pcre16_fullinfo.o}
      {$L pcre16_get.o}
      {$L pcre16_maketables.o}
      {$L pcre16_newline.o}
      {$L pcre16_ord2utf16.o}
      {$L pcre16_refcount.o}
      {$L pcre16_string_utils.o}
      {$L pcre16_tables.o}
      {$L pcre16_ucd.o}
      {$L pcre16_valid_utf16.o}
      {$L pcre16_version.o}
      {$L pcre16_xclass.o}
      {$L pcre16_default_tables.o}
    {$ENDIF}
  {$ELSE}
    {$IF Defined(Win32)}
      {$L pcre_study.obj}
      {$L pcre_compile.obj}
      {$L pcre_config.obj}
      {$L pcre_dfa_exec.obj}
      {$L pcre_exec.obj}
      {$L pcre_fullinfo.obj}
      {$L pcre_get.obj}
      {$L pcre_maketables.obj}
      {$L pcre_newline.obj}
      {$L pcre_ord2utf8.obj}
      {$L pcre_refcount.obj}
      {$L pcre_tables.obj}
      {$L pcre_ucd.obj}
      {$L pcre_valid_utf8.obj}
      {$L pcre_version.obj}
      {$L pcre_xclass.obj}
      {$L pcre_default_tables.obj}
    {$ELSEIF Defined(Win64)}
      {$L pcre_study.o}
      {$L pcre_compile.o}
      {$L pcre_config.o}
      {$L pcre_dfa_exec.o}
      {$L pcre_exec.o}
      {$L pcre_fullinfo.o}
      {$L pcre_get.o}
      {$L pcre_maketables.o}
      {$L pcre_newline.o}
      {$L pcre_ord2utf8.o}
      {$L pcre_refcount.o}
      {$L pcre_tables.o}
      {$L pcre_ucd.o}
      {$L pcre_valid_utf8.o}
      {$L pcre_version.o}
      {$L pcre_xclass.o}
      {$L pcre_default_tables.o}
    {$ENDIF}
  {$ENDIF}
{$ENDIF MSWINDOWS}


KodeZwerg 4. Jul 2022 16:01

AW: Laden eines .webp Bildes?
 
Mit der skia4delphi API sollte dies möglich sein.
Zumindest bringt es laut beschreibung alles für FMX CrossPlatform mit.

softtouch 4. Jul 2022 17:01

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1508335)
Mit der skia4delphi API sollte dies möglich sein.
Zumindest bringt es laut beschreibung alles für FMX CrossPlatform mit.

Schon, aber das ist overkill und ich will auf keinen Fall abhängig von irgendwelchen 3rd. Party Komponenten sein. Damit bin ich schon mehrmals auf die Nase gefallen.

venice2 4. Jul 2022 17:45

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1508335)
Mit der skia4delphi API sollte dies möglich sein.
Zumindest bringt es laut beschreibung alles für FMX CrossPlatform mit.

Es wurde doch ganz klar vom TE zitiert! :roll:
Zitat:

somit suche ich nacheiner reinen Pascal Lösung ohne externe Abhängigkeiten.

KodeZwerg 4. Jul 2022 19:01

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von venice2 (Beitrag 1508341)
Zitat:

Zitat von KodeZwerg (Beitrag 1508335)
Mit der skia4delphi API sollte dies möglich sein.
Zumindest bringt es laut beschreibung alles für FMX CrossPlatform mit.

Es wurde doch ganz klar vom TE zitiert! :roll:
Zitat:

somit suche ich nacheiner reinen Pascal Lösung ohne externe Abhängigkeiten.

Hmmm.... das kommt nun mal von Google... ohne externe Abhängigkeit, mir fiele jetzt nur auf die schnelle einen modernen Web-Browser zu embedden und darin das Bild darstellen zu lassen, wie man es speichert da bin ich überfragt aber dies könnte vielleicht eine Möglichkeit sein.

HolgerX 5. Jul 2022 12:32

AW: Laden eines .webp Bildes?
 
Hmm..

Ich glaube mit nativ Pascal wird das nichts...

Aber:

Die Tools unter
https://developers.google.com/speed/webp/download

herunterladen und dann kann per Commandozeilen Tool 'dwebp' das WebP dekodiert werden.
(https://developers.google.com/speed/webp/docs/dwebp)

Einfach per ShellExec mit den richtigen Parametern füttern und Du hast zu mindestens PNG, TIFF oder BMP.
Auch ist es möglich, per stdin das webp als Daten (ohne Zwischenspeicherung als Datei) zu übergeben und ebenso per Stdout wieder als Data zurück zu bekommen.

Hinweis:
'Precompiled WebP utilities and library for Linux, Windows and macOS / Precompiled WebP framework for iOS'

Somit sollte es auch unter anderen OS funktionieren.

Neutral General 5. Jul 2022 13:21

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von softtouch (Beitrag 1508339)
Schon, aber das ist overkill und ich will auf keinen Fall abhängig von irgendwelchen 3rd. Party Komponenten sein. Damit bin ich schon mehrmals auf die Nase gefallen.

Dann bin ich mir nicht sicher was du willst. Das einzige was dir sonst noch übrig bleibt ist das ganze selbst anzupacken:
https://developers.google.com/speed/webp/

Rollo62 5. Jul 2022 14:00

AW: Laden eines .webp Bildes?
 
Also ich würde dass im Zweifel mit Delphi4Skia machen, das unterstützt WebP.
Einfach mal ausprobieren, das ist relatin simpel einzubinden und ist notfalls auf allen Plattformen verfügbar.

jaenicke 5. Jul 2022 14:26

AW: Laden eines .webp Bildes?
 
Ja, mit Skia funktioniert das gut, das habe ich selbst schon ausprobiert, und es läuft auf allen Plattformen, die Delphi selbst unterstützt.

Rolf Frei 5. Jul 2022 14:39

AW: Laden eines .webp Bildes?
 
Aber dafür könnte man auch einfach die Delphi Klasse TWICImage (Kapselung der Windows Imaging Component) nutzen. Ok, ist nur für Windows, aber damit konvertiere ich massenweise WEBP Bilder.

Delphi-Quellcode:
            FWICImage := TWICImage.Create;
            try
              FWICImage.LoadFromFile(ImagesDir + ImgName + '_tmp.jpg');
              DoConvert := FWICImage.ImageFormat <> wifJpeg;
              if DoConvert then
              begin
                FWIcImage.ImageFormat := wifJpeg;
                FWICImage.SaveToFile(ImagesDir + ImgName);
              end;
            finally
              FWICImage.Free;
            end;
Hier in meinem Fall liegen die Bilder aber mit der Endung Jpg vor, obwohl es WEBP Bilder sind. Interessanter Weise hat der Webbrowser damit kein Problem. Mein Programm aber weldete ständig JPEG Fehler. Nach Analyse was da los ist, habe ich herausgefunden, dass das nicht JPG's sondern WEBP Bilder mit der Endung jpg sind. Teilsweise liegen die Bilder als JPG voer teilweise als WEBP, daher die Überprüfung in der Konvertierungroutine. Die TWICImage Klasse kann diese Dateien auch problemlos lesen und konvertieren.

himitsu 5. Jul 2022 15:17

AW: Laden eines .webp Bildes?
 
Der Webbrowser achtet auf den ContentType (image/jpeg), nicht auf den Namen (Dateierweiterung).
Aber meißtens gehen die davon aus, dass eh alle Webdesigner nichtskönnende Schlampen sind, und schaut sich den Dateiinhalt an, also was wirklich da drin ist.


TImage/TGraphic hatte früher auch immer nur auf die Dateiendung geachtet.
Daher mußte man bei Streams selbst dafür sorgen, dass die richtige Graphics-Klasse geladen ist.

ABER jetzt schauen die nach, was wirklich drin ist (zumindestens werden die 4 MagicBytes angesehn) ... drum kann man nun auch Image1.Picture.LoadFromStream nutzen, sowie TDBImage mit unterschiedlichen Bildformaten im BLOB (Stream).


TWICImage (Windows Imaging Component ) macht auch sowas (Inhalt ansehn).

Rollo62 5. Jul 2022 16:51

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von Rolf Frei (Beitrag 1508383)
Aber dafür könnte man auch einfach die Delphi Klasse TWICImage (Kapselung der Windows Imaging Component) nutzen. Ok, ist nur für Windows, aber damit konvertiere ich massenweise WEBP Bilder.

Interessant, wenn das geht wäre das ja super.
Bist Du denn sicher dass WebP da standardmäßig im Windows unterstützt wird (is ja immerhin von Google) ?
Vielleicht hast Du irgendwo einen Link zu WICImage, mit der Liste der Formate,
ich vermute aber dass man dafür noch irgendeine Extension installieren muss, oder nicht ?

KodeZwerg 5. Jul 2022 17:06

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von Rollo62 (Beitrag 1508396)
Vielleicht hast Du irgendwo einen Link zu WICImage

@Rollo
Einfach mal bei Microsoft als Anlaufstelle reinschauen, aber es wäre für seinen Zweck (FMX) absolut unpassend.

@TE
CLI Tools in Resource packen und je nach OS "entpacken" und nutzen wäre praktikabel.
WebBrowser (und evtl sogar eine Online-Konvertierung) wäre praktikabel.
Api die FMX unterstützt (wie Skia...) oder direkt die WebP-Library einbinden und nutzen.

Das Du Libraries die das machen was Du möchtest als Overkill abstempelst, okay, ist ja kein Zwang das zu nutzen, aber ich bin gespannt wie Du dieses Problem löst.

Rollo62 5. Jul 2022 17:20

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1508399)
Zitat:

Zitat von Rollo62 (Beitrag 1508396)
Vielleicht hast Du irgendwo einen Link zu WICImage

@Rollo
Einfach mal bei Microsoft als Anlaufstelle reinschauen, aber es wäre für seinen Zweck (FMX) absolut unpassend.

Dankesehr für den Hinweis.
Das hab ich natürlich gemacht und nicht nur bei M$ gesucht, ich finde allerdings keinerlei Hinweise darauf dass Microsoft-WIC sowas wie .WebP beherrscht,
deswegen frage ich ja nach.

Rolf Frei 5. Jul 2022 17:59

AW: Laden eines .webp Bildes?
 
Also ich habe bei mir nichsts spezielles installieren müssen, damit das WEBP unterstützt wird. Was mit der Windows Fotoanzeige angezeigt werden kann, wird auch von TIWCImage unterstützt, da dieses vermutlich auch diese Windows Imaging Component nutzt. Meiner Meinung nach ist das Bestandteil von mindesten Windows 10. Ob das auch in älteren Windows Versionen läuft, weiss ich nicht, da ich das da noch nie getestet habe.

Gemäss Doku werden da aber Codecs verwendet und bei den Standard Codecs wird das WEBP Format nicht angezeigt. Könnte also sein, das der Codec durch Firefox oder Edge auf dem PC landen oder halt bei Windows 10 wirklich direkt dabei sind.

himitsu 5. Jul 2022 19:33

AW: Laden eines .webp Bildes?
 
Grundsätzlich:
https://docs.microsoft.com/de-de/win...#native-codecs
https://docs.microsoft.com/en-gb/win...ive-wic-codecs


Aber andere Programme können da Teile nachrüsten.
Kann gut sein, dass z.B. der Webbrowser oder ein anderes Programm sich dort registriert hat, falls Webp wirklich nicht direkt durch Windows dort drin ist.
https://github.com/webmproject/webp-wic-codec

Das ist wie beim Windows Scripting Host, wo Windows die Schnittstelle und ein paar Basis-Scriptsprachen bietet und dann Andere das erweitern können.


Ihr könnt das ja mal in einem leeren/frischen Windows ausprobieren,
bzw. in der sehr rudimentären Windows-Sandbox.
Bei Google suchenwindows sandbox
https://www.delphipraxis.net/207151-...s-sandbox.html
https://blogs.embarcadero.com/window...ndbox-6936052/
https://blogs.embarcadero.com/how-to...ndows-sandbox/
...

TiGü 6. Jul 2022 14:10

AW: Laden eines .webp Bildes?
 
Doofe Antwort, die aber ohne Third-Party und Abhängigkeiten auskommen:
Man könnte natürlich auch die ganzen RFCs und Beispielimplementierungen zu WebP lesen und das selber in Delphi hacken.
Aber die dafür nötige Zeit muss auch erstmal bezahlt werden.

softtouch 6. Jul 2022 14:54

AW: Laden eines .webp Bildes?
 
Eigentlich muss ich ja nur ein kleines icon laden, welches immer nur in .webp vorliegt (favicon). Dafür skia inkl. DLL etc. ist einfach overkill.
Ich denke, ich werde das icon wohl erst einmal ignorieren, bis ich eine Lösung gefunden habe.
Ich bin davon ausgegangen, dass es mittlerweile schon eine einfache Lösung für .webp gibt, aber da lag ich wohl falsch.

himitsu 6. Jul 2022 15:14

AW: Laden eines .webp Bildes?
 
TWICImage von WEBP zu ICO/BMP/JPEG/PNG ?

softtouch 6. Jul 2022 16:40

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von himitsu (Beitrag 1508480)
TWICImage von WEBP zu ICO/BMP/JPEG/PNG ?

Das ist leider nicht cross platform, nur Windows soweit ich sehe.

himitsu 6. Jul 2022 17:07

AW: Laden eines .webp Bildes?
 
In der VCL, da nimmt TPicture.Graphic (TImage.Picture.Graphic) den passenden Typen auf.
z.B. Bitmap, Jpeg und PNG könnte man da drin mit TWICImage laden, aber standardmäßig nimmt die VCL dafür TBitmap, TJPEGImage oder TPNGImage.


Im FMX weiß ich jetzt nicht genau, aber da ist das "TBitmap" was Anderes und macht intern auch PNG/JPEG/GIF/TIFF.
Müsste man mal im TBitmapCodecManager nachsehn (gefunden, indem ich einfach mal in TBitmap.LoadFromFile geguckt hab), ob der auch Anderes können könnte.

TurboMagic 13. Nov 2022 09:05

AW: Laden eines .webp Bildes?
 
Wie macht das SKIA?
Lt. deren GitHub Projektseite ist da auch webp Unterstützung drin:
https://github.com/skia4delphi/skia4delphi

Frickler 16. Nov 2022 08:43

AW: Laden eines .webp Bildes?
 
Zitat:

Zitat von TurboMagic (Beitrag 1514706)
Wie macht das SKIA?
Lt. deren GitHub Projektseite ist da auch webp Unterstützung drin:
https://github.com/skia4delphi/skia4delphi

Sie binden die Skia-DLL ein. Skia4Delphi ist ein Wrapper.

Allerdings steht in der Doku "Skia4Delphi has its own forked version of Skia with the necessary edits to make the library work". Ist also nicht ganz die Original DLL.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 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