Delphi-PRAXiS

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?

himitsu 17. Jun 2018 14:18

AW: Bitmap aus Stream lesen
 
Wie fast alle Anderen auch ... über die Magic-Number.
Also anhand der ersten paar Byte, den Dateityp erkennen.

Bisher wurde zu jedem TGraphic nur die Dateiendung hinterlegt und jetzt eben auch die Magic-Number.
So kann nun auch in Datenbank-Blobs das Bild in verschiedenen Formaten gespeichert und automatisch geladen/angezeigt werden.

Redeemer 17. Jun 2018 20:07

AW: Bitmap aus Stream lesen
 
Wie genau wird die magische Zahl gesetzt? Ist ja wahrscheinlich irgendwo in der
Delphi-Quellcode:
initialization
. Wie ist das mit Formaten, die theoretisch mehrere magische Zahlen haben? SVG wäre so ein Fall, durch BOM, teilweise alte Header usw.

Dennis07 18. Jun 2018 03:20

AW: Bitmap aus Stream lesen
 
Zitat:

Zitat von Redeemer (Beitrag 1405015)
Wie genau wird die magische Zahl gesetzt? Ist ja wahrscheinlich irgendwo in der
Delphi-Quellcode:
initialization
. Wie ist das mit Formaten, die theoretisch mehrere magische Zahlen haben? SVG wäre so ein Fall, durch BOM, teilweise alte Header usw.

Nein, dort werden nur Sachen zur Registrierung von Dateitypen gesetzt (Dateierweiterung im speziellen). Die "Magic Numbers" findest du in den jeweiligen Klassen wieder, so ist es dann auch möglich, mehrere oder keine zu implementieren, und Code bleibt zu 100% kompatibel. Die überprüfung der der Zahl(en) wird idR in der Klassenfunktion
Delphi-Quellcode:
TGraphic.CanLoadFromStream
vorgenommen.


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