Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Bitmap aus Stream lesen (https://www.delphipraxis.net/196755-bitmap-aus-stream-lesen.html)

Zodi 16. Jun 2018 17:54

Bitmap aus Stream lesen
 
Hi Delphianer

Ich versende über die sockets ein bmp Bild.

Wenn ich die Daten empfange und in eine Datei schreibe und als .bmp abspeichere kann ich die Bilddatei anschauen.
Aber sobals ich den Stream in eine Timage lade wird nichts angezeigt.

Delphi-Quellcode:
    stream := tmemorystream.Create;
    stream.WriteBuffer(pointer(data)^,length(data));
    stream.Position := 0;

    assignfile(f, 'C:\00\testbild.bmp');
    rewrite(f);
    writeln(f, data);
    closefile(f);


 //   Image1.Picture.LoadFromFile('c:\00\testbild.bmp');

      Image1.Picture.Bitmap.LoadFromStream(Stream);

  end;
Was mach ich da falsch das ich mit Image1.Picture.Bitmap.LoadFromStream(Stream); nichts angezeigt bekomme?

Grüsse Zodi

KodeZwerg 16. Jun 2018 18:17

AW: Bitmap aus Stream lesen
 
Vielleicht fehlt noch ein Image1.Repaint?

edit
also nach dieser Zeile
Zitat:

Zitat von Zodi (Beitrag 1404973)
Delphi-Quellcode:
Image1.Picture.Bitmap.LoadFromStream(Stream);

Falls das unkklar sein sollte.

Zacherl 16. Jun 2018 18:29

AW: Bitmap aus Stream lesen
 
Du musst
Delphi-Quellcode:
Position
vor dem
Delphi-Quellcode:
LoadFromStream
erst wieder auf 0 setzen.

KodeZwerg 16. Jun 2018 18:31

AW: Bitmap aus Stream lesen
 
Zitat:

Zitat von Zodi (Beitrag 1404973)
Delphi-Quellcode:
stream.Position := 0;

Macht er doch?

Zacherl 16. Jun 2018 18:33

AW: Bitmap aus Stream lesen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1404978)
Zitat:

Zitat von Zodi (Beitrag 1404973)
Delphi-Quellcode:
stream.Position := 0;

Macht er doch?

Ich bin blind scheinbar 8-)

Probier mal
Delphi-Quellcode:
Image.Picture.LoadFromStream
statt
Delphi-Quellcode:
Image.Picture.Bitmap.LoadFromStream
.

KodeZwerg 16. Jun 2018 18:56

AW: Bitmap aus Stream lesen
 
Ich bin der Meinung mal gelesen zu haben das LoadFromFile ein Repaint/Refresh/Update/Redraw/o.ä. automatisch ausführt und ein LoadFromStream nicht, warten wir mal ab was hilft :-)

Redeemer 16. Jun 2018 21:58

AW: Bitmap aus Stream lesen
 
Delphi-Referenz durchsuchenTImage.Picture.Bitmap dürfte zu dem Zeitpunkt gar nicht initialisiert sein (vorher irgendwas mit Delphi-Referenz durchsuchenTImage.Canvas machen wäre auch möglich). Da Delphi den Dateityp einer Bilddatei (für die Auswahl von Delphi-Referenz durchsuchenTGraphicClass) ausschließlich über die Erweiterung bestimmt (die ein Stream nicht hat), musst du die
Delphi-Quellcode:
Graphics.TBitmap
selbst erstellen.
Delphi-Quellcode:
Graphics.TBitmap
(es gibt mehrere Klassen in Delphi, die TBitmap heißen) weist man einem Bild zu, indem man
Delphi-Quellcode:
TPicture.Assign
aufruft (nicht
Delphi-Quellcode:
TGraphics.Assign
).

Delphi-Quellcode:
var
  BMP: Graphics.TBitmap;
begin
  TuEtwasMitDem(Stream);

  BMP := Graphics.TBitmap.Create;
  BMP.LoadFromStream(Stream);
  Image1.Picture.Assign(BMP);
  BMP.Free;
end;

himitsu 16. Jun 2018 22:15

AW: Bitmap aus Stream lesen
 
Zitat:

TImage.Picture.Bitmap dürfte zu dem Zeitpunkt gar nicht initialisiert sein
Sobald man auf .Bitmap oder .Icon zugreift, wird es automatisch erstellt, wenn .Graphic nicht diesem Typen entspricht. (leider wird es auch komplett neu erstellt und das ohne Übernahme des alten Bildinhaltes, aber das ist hier ja egal)

Zitat:

Da Delphi den Dateityp einer Bilddatei ausschließlich über die Erweiterung bestimmt
Jupp, darum funktionierte "damals" auch nur Picture.LoadFromFile und nicht LoadFormStream,
außer bei Picture.Graphic.LoadFromStream, wenn man vorher selber für den passenden TGraphic-Typen gesorgt hatte.

Das wurde inzwischen aber behoben (Delphi 10.x) ... allerdings weiß ich grade nicht, ob das nur für FMX gilt, oder ob es auch bei der VCL so ist, aber ich glaub das ist nun bei Beiden so.

KodeZwerg 16. Jun 2018 22:52

AW: Bitmap aus Stream lesen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 MS: TMemoryStream;
begin
  MS := TMemoryStream.Create();
  try
    Image2.Picture.Bitmap.FreeImage; // hab Versucht ein blinken hervorzurufen, klappt nicht, Code zu schnell.
    Image2.Repaint; // hab Versucht ein blinken hervorzurufen, klappt nicht, Code zu schnell.
    Image1.Picture.Bitmap.SaveToStream(MS);
    MS.Position := 0;
    Image2.Picture.Bitmap.LoadFromStream(MS);
    if CheckBox1.Checked then Image2.Repaint;
  finally
    MS.Free;
  end;
end;
Ich habe es einfach mal selbst nach gebaut, vielleicht mache ich ja auch etwas anders als wie Du, auf jeden fall klappt es so ohne Fehler, egal ob Repaint oder nicht. Nun frage ich mich, was ist Deine Quelle?
In meinem Beispiel kopiere ich Imaga1 in Stream und lade den in Image2.

Redeemer 17. Jun 2018 13:49

AW: Bitmap aus Stream lesen
 
Zitat:

Zitat von himitsu (Beitrag 1404991)
Das wurde inzwischen aber behoben (Delphi 10.x) ... allerdings weiß ich grade nicht, ob das nur für FMX gilt, oder ob es auch bei der VCL so ist, aber ich glaub das ist nun bei Beiden so.

Wie macht er das jetzt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 Uhr.
Seite 1 von 2  1 2      

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