AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy/TCP Probleme mit senden von JPG Bildern
Thema durchsuchen
Ansicht
Themen-Optionen

Indy/TCP Probleme mit senden von JPG Bildern

Ein Thema von uspegasus · begonnen am 12. Okt 2004 · letzter Beitrag vom 13. Okt 2004
Antwort Antwort
uspegasus

Registriert seit: 8. Okt 2004
3 Beiträge
 
#1

Indy/TCP Probleme mit senden von JPG Bildern

  Alt 12. Okt 2004, 18:50
Hallo Leute! Ich habe folgendes Problem:

Ich möchte mit Indy TCP Server und Client Bilder im Jpeg Format senden und empfangen.
Das senden klappt auch ganz gut aber das Bild lässt sich nach dem auslesen aus dem Stream nicht mehr als Jpeg anzeigen?
Es wird auf der Festplatte als Jpeg gespeichert lässt sich aber nicht mehr aufrufen? Habe festgestellt das das gesendete
Bild immer genau 31 Bytes kleiner ist als das Originalbild! Weis aber nicht warum?

Vielleicht hat einer von euch ne Idee woran das liegen kann. Würde mich sehr freuen wenn ihr mir helfen könntet!

hier der Code:

Delphi-Quellcode:
procedure TfrmMain.Button10Click(Sender: TObject);
var MSGText : String;
var BMPStream : TfileStream;
begin
    if ListView1.SelCount = 0 then begin
       MessageBox(0, 'Bevor sie eine Bildnachricht abschicken müssen sie ein User auswählen!', 'Bildnachricht schicken!', MB_OK or MB_ICONERROR);
       exit;
    end else begin
         MSGText := Memo2.Lines.DelimitedText;
         MSGClient.Host := userIP;
         MSGClient.Port := 9003;
         MSGClient.Connect;
         MSGClient.WriteLn('__'+uname+'__');
         MSGClient.WriteLn('++'+MSGText+'++');
         if MSGClient.Connected then begin
         MSGClient.Disconnect;
         MSGClient.Host := userIP;
         MSGClient.Port := 9003;
         MSGClient.Connect;
         if FileExists(ExtractFilePath(Application.ExeName)+ 'archiv\MessagePic.jpg') then begin
         BMPStream := TfileStream.Create(ExtractFilePath(Application.ExeName)+ 'archiv\MessagePic.jpg',fmOpenRead + fmShareDenyNone); //Das Bild wird in den FileStream eingelesen!
         MSGClient.OpenWriteBuffer;
         MSGClient.WriteStream(BMPStream); //Bild wird geschickt!
         MSGClient.CloseWriteBuffer;
         MSGClient.Disconnect;
         end;
       end;
    end;
end;

procedure TfrmMain.MSGServerExecute(AThread: TIdPeerThread);
var ftmpStream : TFileStream;
var TCopy : String;
var s : String;
var saveText : TextFile;
var savename : String;
var MSGJpeg : TJpegImage;

begin
       MSGcount := MSGcount+1;
       s := AThread.Connection.ReadLn;
       TCopy := copy(s,1,2);
    if Tcopy = '__then begin
       MSGname := s+IntToStr(MSGcount);
       end else begin
    if TCopy = '++then begin
       savename := ExtractFilePath(Application.ExeName)+'message\'+MSGname+'.txt';
       AssignFile(saveText, savename);
       {$i-} Rewrite(saveText); {$i+} 
       if IOResult <> 0 then begin
       MessageBox(0, 'Fehler beim speichern der Nachricht!', 'Bildnachricht schicken!', MB_OK or MB_ICONERROR);
       exit;
       end;
       Write(saveText, s);
       CloseFile(saveText);
       end else begin
           try
           ftmpStream := TFileStream.Create(ExtractFilePath(Application.ExeName)+'message\'+MSGname+'.jpg',fmCreate);
           AThread.Connection.ReadStream(ftmpStream,-1, true); //Der FileStream wird als Jpeg gespeichert. Daten sind da aber das Bild lässt sich nicht öffnen???
           finally
           MSGJpeg := TJpegImage.Create;
           MSGJpeg.LoadFromStream(ftmpStream); //Hier hab ich versucht die Daten direkt vom Stream in das Jpeg zu laden klappt aber nicht? Es werden 0 Bytes übergeben???
           FreeAndNil(ftmpStream);
           MSGJpeg.SaveToFile(ExtractFilePath(Application.ExeName) + 'message\'+MSGname+'.jpg');
           end;
           end;
       end;
end;

Ich habe es auch schon mit TMemoryStream ausprobiert und es klappt auch nicht??
Kann es daran liegen das die Bilder im Jpeg Format sind? TBitmap wäre allerdings viel zu gross.
Es müsste doch auch mit Jpeg gehen oder???


Gruss an alle
uspegasus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Indy/TCP Probleme mit senden von JPG Bildern

  Alt 12. Okt 2004, 18:59
bevor du den Stream in dein JPG direct laden kannst musst du vorher die Position auf 0 setzen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
uspegasus

Registriert seit: 8. Okt 2004
3 Beiträge
 
#3

Re: Indy/TCP Probleme mit senden von JPG Bildern

  Alt 12. Okt 2004, 19:46
Hi Thornberry

du meinst sicherlich das hier;

ftmpStream.Seek(0,soFromBeginning); Habs gerade ausprobiert! Da erhalte ich allerdings die Fehlermeldung:

"Exception der Klasse EJPEG aufgetreten! Meldung: JPEG-Fehler #53!"

Ich glaube das Problem ist das die Daten nicht komplett übergeben werden! Warum auch immer???
Das gesendete Bild ist immer 31 Bytes kleiner als das Original!

Wie kann man sicher sein das immer 100% der Daten gesendet werden?
Vielleicht fällt dir ja etwas dazu ein. Ich probier schon alles mögliche aus und es kommt immer zum selben Ergebnis:
Es fehlen diese 31 Bytes???

Gruss uspegasus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Indy/TCP Probleme mit senden von JPG Bildern

  Alt 12. Okt 2004, 19:50
funktioniert es wenn du nur das JPG im Stream überträgst ohne zusätzliche Informationen? Ich versteh nicht ganz warum du beim Senden vorm senden des bildes nochmal disconnectest.
Hast du schonmal versucht den Stream den du sendest einfach in eine Datei zu schreiben ob es dann klappt? Ich würde an deiner stelle einen Stream erstellen, alles da rein packen und dann den einen Stream senden. Also nix mit WriteLn sondern gleich den gesamten Stream speichern. Da ist es dann auch einfacher den Fehler zu finden in dem du einfach den Stream den du sendest vorher mal in eine Datei speicherst und schaust ob da alles im Stream ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
uspegasus

Registriert seit: 8. Okt 2004
3 Beiträge
 
#5

Re: Indy/TCP Probleme mit senden von JPG Bildern

  Alt 13. Okt 2004, 12:59
Hi Thornberry,

Erstmal vielen Dank für deine schnelle Antwort!
Du hast recht!!! Ich habe mal das Bild allein geschickt und siehe da es geht!
Ich denke es liegt daran das man Strings und Streams nicht gleichzeitig in einer onExecute des Servers abfragen kann!

Denn s := AThread.Connection.ReadLn; versucht dann ebenso den Stream auszulesen und genau hier gehen die Bytes verloren!
Womit AThread.Connection.ReadStream(ftmpStream,-1, true); nicht mehr den kompletten Stream erhält!

Am besten wäre jetzt deine Idee alles in einem Stream zu senden und es als Datei dann abzuspeichern.

Aber??? Wie lese ich die Datei dann aus und trenne die Daten wieder???
Vielleicht hast du ja schon mal so etwas gemacht. Ich leider noch nicht und ich wäre dir für jeden Tipp sehr dankbar!

Gruss uspegasus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:43 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