Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SOAP TBytpeDynArray zum Bild (https://www.delphipraxis.net/197033-soap-tbytpedynarray-zum-bild.html)

arnof 12. Jul 2018 16:39

SOAP TBytpeDynArray zum Bild
 
Hallo,

ich bekomme via Soap Webservice ein Bild in einem

TByteDynArray mit bekannter länge geliefert.

Weis jemand wie ich daraus ein Bild anzeigen kann ohne auf die Platte zu Speichern :pale:

KodeZwerg 12. Jul 2018 16:54

AW: SOAP TBytpeDynArray zum Bild
 
Hier ein JPEG Beispiel, zuerst zerlege ich das JPEG in Bytes, danach wandel ich alles wieder in ein JPEG um.
Füge an passender Stelle Deinen SOAP Code ein.
Delphi-Quellcode:
procedure TfrmMain.Button1Click(Sender: TObject);
var
  memStream : TMemoryStream;
  aByteArray : array of Byte;
  aGraphic1, aGraphic2 : TJPEGImage;
begin
  aGraphic2 := nil;
  aGraphic1 := TJPEGImage.Create;
  try
    aGraphic1.Assign(Image1.Picture.Graphic);

    // Konvertiere JPEG in ein array of byte
    memStream := TMemoryStream.Create;
    try
      aGraphic1.SaveToStream(memStream);
      memStream.Position := 0;
      SetLength(aByteArray, memStream.Size);
      memStream.ReadBuffer(Pointer(aByteArray)^, memStream.Size);
    finally
      FreeAndNil(memStream);
    end;

// Hier Dein Senden Code für aByteArray

// SuppeSendeBytes()

// Jetzt folgt Code um das ganze wieder zum laufen zu bringen

    // Konvertiere array of byte nach JPEG
    memStream := TMemoryStream.Create;
    try
      memStream.WriteBuffer(Pointer(aByteArray)^, Length(aByteArray));
      memStream.Position := 0;
      aGraphic2 := TJPEGImage.Create;
      aGraphic2.LoadFromStream(memStream);
    finally
      FreeAndNil(memStream);
    end;


    // Zeige das Bild
    Image2.Picture.Assign(aGraphic2);
  finally
    // aufräumen
    SetLength(aByteArray, 0);
    FreeAndNil(AGraphic2);
    FreeAndNil(AGraphic1);
  end;
end;

arnof 12. Jul 2018 17:07

AW: SOAP TBytpeDynArray zum Bild
 
Format ist nicht bekannt, in der Doku steht Bilddaten ....

Delphi-Quellcode:
  try
   BlobStream := TMemoryStream.Create;
   BlobStream.Read(eccPic.Data[0],eccPic.DataLength);
   Blobstream.Position := 0;
   Jpg := TJPEGImage.Create;
   try
     Jpg.LoadFromStream(BlobStream);
     cxImage1.Picture.Assign(Jpg);
   finally
     Jpg.Free;
   end;
  finally
   BlobStream.Free;
  end;
das war mein Versuch, fliegt aber weg wenn das Bild angezeigt werden soll:

JPEG-FEHLER #42

KodeZwerg 12. Jul 2018 17:10

AW: SOAP TBytpeDynArray zum Bild
 
Ohhh, dann nützt Dir mein Beispiel-Code auch nicht, oder doch? Ist halt auf JPEG zugeschnitten.

arnof 12. Jul 2018 17:16

AW: SOAP TBytpeDynArray zum Bild
 
ich weiss nicht genau, ob das

BlobStream.Read(eccPic.Data[0],eccPic.DataLength);

stimmt ?

KodeZwerg 12. Jul 2018 17:29

AW: SOAP TBytpeDynArray zum Bild
 
Was bei Dir BlobStream heißt nennt sich bei mir MemStream, vergleiche das einfach.
Wenn dabei Fehler auftreten wäre es praktisch mal ein Beispiel Bild zu erhalten um das Bildformat zu bestimmen.
Wenn es Unterschiedliche Formate sein können muss man das dem Programm beibringen.

arnof 12. Jul 2018 17:30

AW: SOAP TBytpeDynArray zum Bild
 
ich habe es nun via FileStream als bild.jpg gespeichert. dann erscheint das Bild, wie es soll!

Delphi-Quellcode:
  fi:=TFileStream.Create('D:\test\bild.jpg',fmCreate);
  fi.Write(eccPic.Data[0],eccPic.DataLength);
  fi.Free;
Delphi-Quellcode:
  try
   BlobStream := TMemoryStream.Create;
   BlobStream.Read(eccPic.Data[0],eccPic.DataLength);
   Blobstream.Position := 0;

  fi:=TFileStream.Create('D:\test\bild.jpg',fmCreate);
  fi.Write(eccPic.Data[0],eccPic.DataLength);
  fi.Free;


   Jpg := TJPEGImage.Create;
   try
//     Jpg.LoadFromStream(BlobStream);
//     cxImage1.Picture.Assign(Jpg);
     cxImage1.Picture.LoadFromFile('D:\test\bild.jpg');
   finally
     Jpg.Free;
   end;
  finally
   BlobStream.Free;
  end;
weiss jemand wie das nur via memorystream geht ?

KodeZwerg 12. Jul 2018 17:35

AW: SOAP TBytpeDynArray zum Bild
 
Delphi-Quellcode:
  try
   BlobStream := TMemoryStream.Create;
   BlobStream.WriteBuffer(eccPic.Data[0],eccPic.DataLength); // hier sollen wir schreiben und nicht lesen oder?
   Blobstream.Position := 0;
   Jpg := TJPEGImage.Create;
   try
     Jpg.LoadFromStream(BlobStream);
     cxImage1.Picture.Assign(Jpg);
   finally
     Jpg.Free;
   end;
  finally
   BlobStream.Free;
  end;

arnof 12. Jul 2018 17:37

AW: SOAP TBytpeDynArray zum Bild
 
kaum macht man es richtig, funktionierst :lol:

Delphi-Quellcode:
try
   BlobStream := TMemoryStream.Create;
   BlobStream.Write(eccPic.Data[0],eccPic.DataLength);
   Blobstream.Position := 0;
   Jpg := TJPEGImage.Create;
   try
     Jpg.LoadFromStream(BlobStream);
     cxImage1.Picture.Assign(Jpg);
   finally
     Jpg.Free;
   end;
  finally
   BlobStream.Free;
  end;
wenn man Read und Write verwechselt, so wird das nichts :pale:

Danke für die Hilfe!

KodeZwerg 12. Jul 2018 17:43

AW: SOAP TBytpeDynArray zum Bild
 
Zitat:

Zitat von arnof (Beitrag 1407062)
Danke für die Hilfe!

Gern geschehen:thumb:


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