zlib und GdiPlus_SaveImageToBuffer() Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Ralf28

zlib und GdiPlus_SaveImageToBuffer()

14 Jun 2018, 15:09

Hallo ihr Lieben und zwar habe ich eine Frage. Ich erkläre mal eben was mein Problem ist.

Ich erstelle ein "pbitmap" mit Gdi+ ---> danach wandel ich es in ein "hbitmap-handle" ---> dann speicher ich das "hbitmap-handle" in einen Speicher mit der Funktion von SKAN ---> https://autohotkey.com/board/topic/8552 ... etobuffer/

Das klappt alles wunderbar aber jetzt komme ich auch zu meinem Problem, ich möchte den Speicher also den Buffer mit "zlib" komprimieren um daraus einen kürzeren String zu bekommen was unbedingt nötig ist da ich diesen via LAN im Netzwerk verschicken möchte.

Ich habe mich natürlich darum selbst schon bemüht aber ich komme auf keine Lösung. Ich habe dafür diesen Beitrag gefunden um die zlib.dll zu benutzen ---> https://autohotkey.com/board/topic/63343-zlib/

Kann mir einer vielleicht erläutern in Form von einem Beispiel oder einer Erklärung wie ich den Speicher mit dem Namen "PNGDATA" der aus der Funktion "SaveImageToBuffer" resultiert mit zlib korrekt komprimieren kann, sodass ich das komprimierte Ergebnis als String via Winsock versenden kann?

Ich hoffe jemand weiß mehr wie ich.

Liebe Grüße
Ralf
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: zlib und GdiPlus_SaveImageToBuffer()

15 Jun 2018, 03:04

Moin,

ich nehme mal an, Du willst die Funktionen zlib_Compress() bzw. zlib_Decompress() nutzen.

An zlib_Compress() kannst Du im Parameter Data die an GdiPlus_SaveImageToBuffer() im Parameter Buffer übergebene Variable übergeben. In den Parameter DataLen gehört der Rückgabewert von GdiPlus_SaveImageToBuffer().

Für zlib_Decompress() brauchst Du außer der Variablen mit den komprimierten Daten zumindest auch die Länge der komprimierten Daten für den Parameter DataLen.

Du kannst allerdings weder die unkomprimierten noch die komprimierten Daten "als String via Winsock versenden". Es sind binäre Daten.
Ralf28

Re: zlib und GdiPlus_SaveImageToBuffer()

16 Jun 2018, 10:20

Vielen Dank für deine Antwort. Es hat wunderbar geklappt bis auf die tatsache das ich falsch lag es als "String" zu versenden.

Ich habe mich jetzt versucht zu erkundigen und habe nur die möglichkeit gefunden Sie mit Base64 zu encoden und später wieder zu decoden aber daraus resultiert ein etwas großer String der nicht leicht zu übertragen ist trotz Komprimieren der Bild Daten. >.< Es klappt zwar aber ich kann das Bild nur in ziemlich schlechter Qualität versenden da wie gesagt der String durch das encoden mit Base64 ansonsten zu groß ist.

Hat jemand eine Ahnung wie ich die Binären Bild Daten auch so versenden kann? Ich habe es schon versucht mit der Winsocket Lib von Bentschi ---> http://ahkscript.org/germans/forums/vie ... 789b388655
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: zlib und GdiPlus_SaveImageToBuffer()

17 Jun 2018, 02:26

Wenn Du ein Bild komprimierst und danach in einen Base64 String umwandelst, kann der größer sein als die unkomprimierten Bilddaten.

Wie genau sendest Du denn Deine Daten 'als String'? Und warum müssen die übers Netz geschickt werden?
Ralf28

Re: zlib und GdiPlus_SaveImageToBuffer()

17 Jun 2018, 10:14

Momentan sende ich die Daten mit der Winsock Lib von Bentschi ---> http://ahkscript.org/germans/forums/vie ... 789b388655

Ich baue wie gewohnt eine Verbindung auf und danach sende ich die Daten die ich vorher komrpimiert habe und danach mit Base64 encoded habe mit dem Befehl

Code: Select all

WS_Send(socket, message, len=0, flags=0)
am anderen Ende der Verbindung nehme ich die daten entgegen und mache alles wieder rückgängig sodass ich die umkomprimierten Bild Daten wieder habe um Sie zu zeichnen und sie dann mit "BitBlt" aus der gdi32.dll in den Gerätekontext des Gui´s zu kopieren.

Ich merke selber das die Komprimierten Daten nicht wirklich kürzer sind als die unkomprimierten Daten solange ich diese am Ende mit Base64 encode und versende. Aber Ich habe keine möglichkeit bis jetzt gefunden die Daten ohne Base64 zu verwenden, versenden zu können.

Zu deiner Frage warum Sie überhaupt übers Netz also im LAN versendet werden müssen. Ich möchte damit ein Screen-Sharing Script erreichen, wie gesagt es funktioniert alles soweit bis auf die Tatsache das die Bild Daten zulang sind wenn ich Base64 verwende und dadurch ab und zu verzögerungen auftreten beim anzeigen des Bildes auf der Client Seite.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: zlib und GdiPlus_SaveImageToBuffer()  Topic is solved

17 Jun 2018, 11:04

Das was du versenden willst ist an sich ein Stream
Ich würde dir hierbei nicht empfehlen GDI+ zu verwenden und einzelne Bilder zu enkodieren.
Dafür solltest du wenn dann ein streaming Format verwenden.

An sich sollte es auch möglich sein binär Daten mit Bentschis neuren Socket libraries oder der neuesten Version von GeekDude möglich sein.
Recommends AHK Studio
Ralf28

Re: zlib und GdiPlus_SaveImageToBuffer()

17 Jun 2018, 18:52

Danke für eure Antworten und Hilfestellungen.

Ich habe es jetzt hinbekommen die Daten Binär zu versenden mit der Lib von Bentschi die mir nnnik empfohlen hat. Ich habe es jetzt weiterhin erstmal mit GDI gelöst obwohl es prozessorlastig ist aber mit einem Prozessor der nicht allzu alt ist sollte es soweit auch auf anderen Computern laufen und es funktioniert soweit perfekt und bin zufrieden. Feintuning kann man ja immer noch vornehmen zwecks alternativen zu GDI.

Danke nochmal an euch, Ihr seid die Besten!


Liebe Grüße

Ralf

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 29 guests