TImage in String schreiben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

TImage in String schreiben

Beitrag von lenny_hai »

Hallo nochmal,

vor einer Weile habe ich ein kleines Programm geschrieben, was Etiketten auf einem Labelprinter ausdruckt.
Dabei habe ich mich der Sprache des Druckers bedient und die Befehle dann via IdTCPClient an den Drucker gesendet.
Das klappt seit Jahren ganz gut.
Leider komme ich bei einigen Sachen nicht weiter und wollte "einfach" ein Image (BMP) erstellen und das an den Drucker senden.
Mein Problem ist, dass ich dazu die Daten des Bildes in einen String bekommen müsste. Davor und dahinter kommen dann ja noch die Steuercodes.

Weiß jemand, wie ich die Bilddaten als BMP in einen String bekomme. Das mit Streams bekomme ich nicht hin, meine Notlösung wäre als Datei speichern und dann in einen String laden, aber das ist irgendwie echt sehr provisorisch.

Über eine Hilfestellung wäre ich dankbar.

Bei der Gelegenheit, weiß jemand wie die Funktion heißt, die dafür sorgt, dass einem beim Eingeben von z.B. form. die möglichen Funktionen etc. angezeigt werden? Bei mir (Kubuntu 22.04 / Lazarus 2.2.0) funktioniert das immer nur für eine Weile und irgendwann werden dann nur noch irgendwelche globalen Sachen vorgeschlagen, aber nichts spezifisches mehr. Wenn ich Lazarus dann beende und wieder neu starte, geht es wieder....


Viele Grüße Sven

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TImage in String schreiben

Beitrag von theo »

Ich kann zwar nicht ganz nachvollziehen was dein Plan ist, aber es gibt:
https://www.freepascal.org/docs-html/rt ... tream.html

Du kannst das Bitmap da hinein speichern mit ABmp.SaveToStream(AStringStream);
Dann müsste das mit der Eigenschaft "DataString" als String zugreifbar sein.

Nicht getestet.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TImage in String schreiben

Beitrag von af0815 »

Nachdem ich ein paar Etikettendrucker kenne, wie genau muss das Image kodiert sein. Weil mit einfach ein BMP streamen ist es oft nicht getan. Die Printer wollen meistens ein genaues Format. Es kann auch sein, das der Bytestrean in Hex umkodiert werden muss.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TImage in String schreiben

Beitrag von Winni »

af0815 hat geschrieben:
Di 13. Dez 2022, 21:46
Es kann auch sein, das der Bytestrean in Hex umkodiert werden muss.
Hi!

Hex enthält ja immer noch Steuercodes < #32.
Base64????

Winni

lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

Re: TImage in String schreiben

Beitrag von lenny_hai »

Moin,

erstmal danke für die Antworten.

https://support.honeywellaidc.com/s/art ... ax-printer

Normalerweise hätte ich auch an HEX oder Base64 gedacht, aber wenn man sich die Beispieldatei ansieht, dann schaut es so aus, als würde einfach das BMP direkt gesendet.
Anders ist es bei ZPL, da wollen die Drucker scheinbar hexfiles, also sozusagen lesbare Dateien. Die müssten dann ja irgendwie doppelt so groß sein, da hier ein Byte als zwei Zahlen/Buchstaben dargestellt werden.
Aber egal.... nach dem Beispiel ist es eigentlich das reine Bitmap.



Viele Grüße Sven

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TImage in String schreiben

Beitrag von af0815 »

Es ist wirklich so das der Honeywell Printer nach den <STX>IGBBMPLOGO<CR> wirklich die Rohdaten haben will.

Aus dem Beispiel 3:

I = Interne Memorybank
G = Grafik
B = .BMP 8-bit format, flipped, black and white (B&W)

Alles so in einem Stream packen und rüber damit :-)

----
@winni: Es gibt Drucker da muss man das Byte in einen Hex String von 2 Zeichen Länge umkodieren. <CR>12<LF> wird dann 0D30310A. Diese Druckerbeschreibungssprachen sind da sehr kreativ. Jeder macht was anderes, damit es ja nicht woanders verwendet werden kann. Zusätzlich laufen dann noch Interpreter in den Druckern um die Sache noch einfacher zu machen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TImage in String schreiben

Beitrag von Winni »

af0815 hat geschrieben:
Mi 14. Dez 2022, 07:09
----
@winni: Es gibt Drucker da muss man das Byte in einen Hex String von 2 Zeichen Länge umkodieren. <CR>12<LF> wird dann 0D30310A. Diese Druckerbeschreibungssprachen sind da sehr kreativ. Jeder macht was anderes, damit es ja nicht woanders verwendet werden kann. Zusätzlich laufen dann noch Interpreter in den Druckern um die Sache noch einfacher zu machen.
Danke.

Wieder was gelernt, obwohl ich mich ziemlich lange mit PCL, PostScript und Artverwandtem rumgeschlagen habe. Glücklicherweise vorbei.

Und bei den Druckertreibern habe ich den Verdacht, dass da die Azubis im 1. Lehrjahr hingeschubst werden. "Leuchtende" Beispiele sind HP und Brother ...

Winni

lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

Re: TImage in String schreiben

Beitrag von lenny_hai »

Hi zusammen,

also nochmal vielen Dank.
Es funktioniert tatsächlich. Ich bin fast verzweifelt, bis ich festgestellt habe, dass der String ok ist, aber idtcpclient sich weigert diesen abzuschicken. Kein Fehler, kein nix.
Habe mir dann bei Wireshark die Pakete angeschaut und sie enthielten tatsächlich keine Daten, anders als wenn ich einfach ein "Hallo" geschickt habe.
Habe jetzt synapse verwendet, damit geht es, aber irgendwie finde ich da keine vernünftige Fehlerbehandlung.


Viele Grüße Sven

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TImage in String schreiben

Beitrag von af0815 »

Der idtcpclient wird sich an den Steuerzeichen stossen. Vor allen, weil auch 0 bytes da zulässig sind. Etwas Code wäre auch hilfreich gewesen. Aber wenn es mit Synapse geht, so ist es auch ok.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

lenny_hai
Beiträge: 12
Registriert: So 11. Dez 2022, 15:06

Re: TImage in String schreiben

Beitrag von lenny_hai »

Moin,

af0815 hat geschrieben:
Mi 14. Dez 2022, 19:50
Der idtcpclient wird sich an den Steuerzeichen stossen. Vor allen, weil auch 0 bytes da zulässig sind. Etwas Code wäre auch hilfreich gewesen. Aber wenn es mit Synapse geht, so ist es auch ok.
Naja, so richtig viel Code habe ich da nicht, den ich reinpacken könnte....

Der Befehl zum speichern des Images sieht so aus:

Code: Alles auswählen

...
Image1.Picture.Graphic.SaveToStream(sstream);
buffer:=sstream.datastring;
buffer:=#002+'IDBBMPLOGO'+#013+buffer;
...
Wenn ich das Beispiel nachbilde und das Bild daraus nehme und dann den String abspeicher, dann habe ich eine Binär gleiche Datei wie das Beispiel... das passt also....

Ich finde gerade den Kram von Indy nicht, habe ich bereits aus dem Code genommen.... aber sinngemäß war es wohl irgendwas wie

Code: Alles auswählen

IdTCPClient1.IOHandler.Write(buffer);
Und das funktionierte mit den "normalen" Steuercodes, also inkl. #002 einwandfrei.
Ich denke das Problem sind eher die Bilddaten.
Ich fände es tatsächlich mit Indy angenehmer, da weiß ich wenigstens, wie ich Fehler abfange....


Viele Grüße Sven

Antworten