Einzelnen Beitrag anzeigen

Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#1

Indy TCP Client: Zu langer String?

  Alt 27. Aug 2014, 12:15
Hallo,

ich will mit Delphi einen Screenshot aufnehmen und ihn auf meinen vServer hochladen.
Ich mache dies momentan so:
Delphi-Quellcode:
// Erzeugt einen Base64-String aus der JPEG Bild-Datei die ich versenden will
function EncodeFile(const FileName: string): AnsiString;
var
  stream: TMemoryStream;
begin
  stream := TMemoryStream.Create;
  try
    stream.LoadFromFile(Filename);
    result := EncodeBase64(stream.Memory, stream.Size);
  finally
    stream.Free;
  end;
end;

// Kompressiert ein BMP in ein JPEG
procedure CompressImage(ImageFrom: TBitmap; ImageTo: TJPEGImage; Quality: integer);
var
  bmp: TBitmap;
  jpeg: TJPEGImage;
  stream: TMemoryStream;
begin
  bmp:=TBitmap.Create;
  jpeg:=TJPEGImage.Create;
  stream:=TMemoryStream.Create;
  try
    bmp.Assign(ImageFrom);
    jpeg.Assign(bmp);
    jpeg.PixelFormat:=jf24bit; // or jf8bit
    jpeg.CompressionQuality:=Quality;
    jpeg.ProgressiveDisplay:=False;
    jpeg.ProgressiveEncoding:=False;

    jpeg.Compress;
    jpeg.SaveToStream(stream);
    stream.Position := 0;
    ImageTo.LoadFromStream(stream);
  finally
    bmp.Free;
    jpeg.Free;
    stream.Free;
  end;
end;


// Erzeugt einen Screenshot
procedure ScreenShot(DestBitmap: TBitmap);
var
  DC: HDC;
begin
  DC:=GetDC(GetDesktopWindow);
  try
    DestBitmap.Width:=GetDeviceCaps(DC, HORZRES);
    DestBitmap.Height:=GetDeviceCaps(DC, VERTRES);
    BitBlt(DestBitmap.Canvas.Handle,0,0,DestBitmap.Width,DestBitmap.Height,DC,0,0,SRCCOPY);
  finally
    ReleaseDC(GetDesktopWindow, DC);
  end;
end;

// Fängt die PrintScreen-Taste auf
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  Screenshot(ss);
  image1.Picture.Bitmap := ss;
  FormStyle := fsStayOnTop;
  Show;
end;

// Upload-Funktion
procedure TForm1.Upload;
var
  URL: string;
  img :TJPEGImage;
  mes : string;
  cmds : TStringList;
  bmp : TBitmap;
begin

  img := TJPEGImage.Create;

  CompressImage(ss, img, Trackbar1.Position);

  img.SaveToFile('./Screenshot.jpeg');

  base64 := EncodeFile('./Screenshot.jpeg');


  idtcpclient1.IOHandler.WriteLn('start');


  idtcpclient1.IOHandler.WriteLn(base64); // Hier wird der Base64-String gesendet


  idtcpclient1.IOHandler.WriteLn('end');


end;
Das funktioniert auch eigentlich alles, aber nicht immer...
Kann es sein, dass der Base64 string zu lange ist?
Der Server ist in Java geschrieben, aber ich denke bei dem ist alles in ordnung.

Hier noch einige Bilder: (Alle nacheinander aufgenommen und hochgeladen ohne das Programm neu zu starten)
Qualität: 55%: http://www.app2k.de/images/nolmIrQ.jpeg Erfolgreich
Qualität: 100%: http://www.app2k.de/images/lnmqLfl.jpeg Erfolgreich
Qualität: 100%: http://www.app2k.de/images/LuelxSM.jpeg Erfolgreich
Qualität: 100%: http://www.app2k.de/images/ZQRnbzN.jpeg Gescheitert

Falls es jemand selbst testen möchte, ich habe das Programm in den Anhang gelegt.
Wichtig:
  1. Die Anwendung ist in der Tray Leiste. Man sollte es mit der PrintScreen Taste hervor holen können. Bei mir auf dem Computer klappt das, aber auf meinem Laptop hat es beim ersten Test nicht geklappt. Falls es nicht gehen sollte kann man einen Doppelklick auf das Tray Icon machen und dabei erzeugt es auch gerade einen Screenshot.
  2. Falls eben so ein fehlgeschlagenes Bild kommen sollte, muss man das Programm neu starten. Den Fehler muss ich noch beheben.

Ich hoffe einer kann mir da helfen, finde ich recht merkwürdig warum das manchmal klappt und manchmal nicht... Das "end" kommt ja auch immer an o_O

Freundliche Grüsse
Angehängte Dateien
Dateityp: rar SmoothPrintServerTester.rar (923,2 KB, 1x aufgerufen)
Milos
  Mit Zitat antworten Zitat