Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   FMX Bitmap von Kamera an Webservice senden (https://www.delphipraxis.net/209115-fmx-bitmap-von-kamera-webservice-senden.html)

friedt99 28. Okt 2021 20:48


FMX Bitmap von Kamera an Webservice senden
 
Hallo zusammen,


ich versuche ein Bild von der IOS Kamera an einen Websevice zu senden.
(FMX Delphi 10.4, XCode 12.5.1)

Was funktioniert:
Delphi-Quellcode:
Var ltDocument:String;
    lcStream:TStringStream;
    lcBitmap:TBitmap;
begin
  lcBitmap:=TBitmap.Create;
  lcStream:=TStringStream.Create;
  Try
    lcBitmap.Width:=100;
    lcBitmap.Height:=100;
    lcBitmap.Canvas.BeginScene;
    lcBitmap.Canvas.Fill.Color:=TAlphaColors.Red;
    lcBitmap.Canvas.FillRect(Rect(0,0,lcBitmap.Width,lcBitmap.height),0,0,AllCorners,1);
    lcBitmap.Canvas.EndScene;

    lcBitmap.SaveToStream(lcStream);
    ltDocument:=TNetEncoding.Base64.Encode(lcStream.DataString);

    --> ltDocument an Webservice senden

  Finally
    lcStream.Free;
   End;
end;
Die Bitmap (wird ja bei SaveToStream als PNG gespeichert) kommt via Webservice in Delphi 7 an und kann nach Dekodierung UTF->String und Decode Base64 als PNG
geöffnet werden.


------------------------------------


Was nicht funtkioniert:

Snippet(1): speichern Bild in TImage.
Delphi-Quellcode:
CameraComponent.SampleBufferToBitmap(imgCamera.Bitmap, True);
Snippet(2): Senden an WebsService

Delphi-Quellcode:
Var ltDocument:String;
    lcStream:TStringStream;
begin
  lcStream:=TStringStream.Create;
  Try
    imgCamera.Bitmap.SaveToStream(lcStream);
    ltDocument:=TNetEncoding.Base64.Encode(lcStream.DataString);
    ..
    ..
Bei der letzten Zeile kommt die Exception:
"Keine Zuordnung für Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden"

Was für eine Konvertierung könnte da denn erforderlich sein für einen PNG Stream ?


Grüße

Thomas

friedt99 29. Okt 2021 07:05

AW: FMX Bitmap von Kamera an Webservice senden
 
Hallo Zusammen,

das konnte ich nun selbst lösen.

So klappt's:

Delphi-Quellcode:
uses Soap.EncdDecd;

procedure SendDocument;
Var ltDocument:String;
    lcStream:TStringStream;
begin
  lcStream:=TStringStream.Create;
  Try
    pcBitmap.SaveToStream(lcStream);
    lcStream.Position:=0;
    ltDocument:=EncodeBase64(lcStream.Memory,lcStream.Size);

    // -> Sende ltDocument an den Webservice
  Finally
    lcStream.Free;
  End;
end;

War wohl die falsche Funktion zum Base64 kodieren.

Noch ein Tip für alle die mit älteren Delphi Versionen:

Ich Kontaktiere den Webservice (nusoap) "zu Fuß", also sende ein
XML mit den WinInet Funktionen und erhalte den Response auch so
wieder zurück.

Um aus den Bilddaten wieder ein PNG zu machen, zuerst UTF8 nach
String dekodieren und danach DecodeBase64 aufrufen.

Grüße
Thomas

Rollo62 29. Okt 2021 07:08

AW: FMX Bitmap von Kamera an Webservice senden
 
Bin nicht sicher ob ich Dich richtig verstehe,
Du bekommst das TBitmap von der Kamera, und möchtest das als PNG verschicken, nicht als BMP.
https://en.delphipraxis.net/topic/43...ndroid-bitmap/
https://delphiaball.co.uk/2015/10/20...lphi-cbuilder/

Falls Du eine Windows-BMP Datei haben möchtest,
BMP wird auf mobilen Platformen nicht out-of-the-box unterstützt.
https://docwiki.embarcadero.com/Libr...apCodecManager

Da müsste man sich was "frickeln" (das habe ich aber nicht getestet):
https://stackoverflow.com/questions/...on-android-ios

friedt99 29. Okt 2021 07:16

AW: FMX Bitmap von Kamera an Webservice senden
 
Hallo Rollo62,

nein, es ging um eine Fehlermeldung bei der Base64 Kodierung
der Bitmap unter FMX.

Hatte wohl die falsche Funktion dafür genommen.

Mit der PNG kann ich leben, da ich auf beiden Seiten
des Webservices die Software stelle.

Auf der "Empfangsseite" (Delphi 7) mache ich aus der PNG
ein JPEG und baue ein PDF außen rum.

Grüße

Thomas

Rollo62 29. Okt 2021 07:54

AW: FMX Bitmap von Kamera an Webservice senden
 
Zitat:

Zitat von friedt99 (Beitrag 1496758)
Auf der "Empfangsseite" (Delphi 7) mache ich aus der PNG
ein JPEG und baue ein PDF außen rum.

Dann konvertiere doch gleich im Phone zu JPG, und spar Dir Arbeit auf der Workstation/Server :stupid:

Olli73 30. Okt 2021 12:39

AW: FMX Bitmap von Kamera an Webservice senden
 
Da ich Binärdaten (Bitmap, png, ...) ungern als String behandele, hätte ich es eher so gemacht:

Delphi-Quellcode:
Var ltDocument:String;
    lcStream:TMemoryStream;
    lcStreamB64:TStringStream;
    lcBitmap:TBitmap;
begin
  lcBitmap:=TBitmap.Create;
  lcStream:=TMemoryStream.Create;
  lcStreamB64:=TStringStream.Create;
  Try
    lcBitmap.Width:=100;
    lcBitmap.Height:=100;
    lcBitmap.Canvas.BeginScene;
    lcBitmap.Canvas.Fill.Color:=TAlphaColors.Red;
    lcBitmap.Canvas.FillRect(Rect(0,0,lcBitmap.Width,lcBitmap.height),0,0,AllCorners,1);
    lcBitmap.Canvas.EndScene;

    lcBitmap.SaveToStream(lcStream);
    TNetEncoding.Base64.Encode(lcStream, lcStreamB64);
    ltDocument:=lcStreamB64.DataString;

    --> ltDocument an Webservice senden

  Finally
    lcStream.Free;
    lcStreamB64.Free;
   End;
end;

HolgerX 31. Okt 2021 20:38

AW: FMX Bitmap von Kamera an Webservice senden
 
Hmm..

Ein paar Fragen:
Wie kommst Du darauf, dass ein TBitmap ein PNG sei?
Ohne z.B. Konvertierung per TPNGImage wird auch beim Speichen kein PNG daraus...

Wieso wird der Stream nach Bitmap.SaveToStream nicht direkt als Binär-Stream an den Webservice geschickt und stattdessen als aufgeblähter Base64 String?

Wie sendest Du denn die Daten an den WebService?

friedt99 2. Nov 2021 10:11

AW: FMX Bitmap von Kamera an Webservice senden
 
Hallo HolgerX,

Wenn man das Bild der CameraComponent einer TBitmap zuweist und dann
die TBitmap mit SaveToFile speichert, kommt ein PNG raus...

Ich sende das Bild als Base64 weil der Webservice unter nusoap (PHP) entwickelt wurde
und ich da keine Möglichkeit gefunden habe, das anders zu lösen.

Grüße

Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.

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