ESC/P nach PNG

OP #2303009
Lesenswert?
• ▲
▼
Moin,

für den Fall, das das jemand brauchen kann: ich hab vor geraumer Zeit 
mal nen Konverter von ESC/P nach PNG und Co geschrieben. Nutze ich für 
mein HP54645D um Screenprints als PNG zu erhalten. Sollte faktisch für 
alle Oszis und Gerätschaften geeignet sein, die ESC/P 
(=EPSON-kompatibler Nadeldrucker) ausspucken können. Man muss die Datei 
halt erstmal aufm PC empfangen und kann sie dann in PNG umwandeln.
Getestet nur unter Linux, sollte aber auch auf anderen Systemen 
übersetzbar sein. Braucht die imlib2.

Aktuelle Version ist unter
http://git.al84.de/?p=escp2img.git;a=snapshot;h=HEAD;sf=tgz

Gruß
Andreas Lang
Angehängte Dateien:
Gast #7480378
Lesenswert?
• ▲
▼

X. H. schrieb:

Wenn jemand escp2img.zip compiliert kriegen will, bei mir funktioniert dieses Kommando (Arch Linux):

gcc -O3 -Wall -Wextra -Wpedantic -o escp2img main.cpp escp.cpp $(pkg-config --cflags --libs imlib2)

imlib2 Paket muss installiert sein.

Danke fuer den codierten Hinweis. Und wie tippe ich das korrekt ein. Copy and paste geht nicht, trotz Arch aktuell.

Angehängte Dateien:
#7480390
Lesenswert?
• ▲
▼

Der Code scheint etwas ... äh, schlunzig zu sein, aber das, was in Deinem Screenshot (warum nur? Das ist Text!) zu sehen sind, sind lediglich Warnungen.

Wie willst Du was korrekt eintippen?

Du hast ja was eingetippt, und es offensichtlich geschafft, gcc aufzurufen.

Die Warnungen liegen halt am ... schlunzigen Code.

Hier jetzt mal die drei aus escp.cpp:

1
#define alloc_blocksize=1024;

Ersetze diesen Unfug durch

1
#define alloc_blocksize 1024

und Du bist schon mal eine Warnung los.

Und das hier

1
fprintf(stderr,"\%02x",cc & 0xff);

durch

1
fprintf(stderr,"\t%02x",cc & 0xff);
1
if ((cc<32)||(cc>127)) {

Offenkundig hat Dein /char/ ein Vorzeichen, deswegen ist in der Zeile davor der Vergleich > 127 sinnlos.

Ersetze den Kram durch "isprint":

1
if (!isprint(cc)) {
#7482104
Lesenswert?
• ▲
▼

Joe schrieb:

Fragt sich nur ich wie die jetzt wegbekomme.

Tja, indem Du Dir jede Fehlermeldung bzw. jede Warnung ansiehst und in Deinem C++-Lehrbuch nachsiehst, was sie bedeuten.

Und fang' vorne, mit der ersten Fehlermeldung bzw. Warnung an.

Wie bereits an den paar Beispielen zu sehen, ist das schlunzig hingerotzter Code.

Allerdings: alles, was Du bislang gezeigt hast, waren keine Fehlermeldungen, sondern Warnungen. Das ist nicht das gleiche. Eine Warnung bedeutet, daß die entsprechende Stelle /potentiell/ fehlerhaft ist, aber sich durchaus übersetzen lässt.

Ein Fehler ist etwas, was den Compiler dazu bringt, das Handtuch zu werfen und kein ausführbares Ergebnis zu produzieren.

Derjenige, der den Code hingerotzt hat, wird wohl Warnungen einfach ignoriert haben, nach dem Motto "wird schon nicht so schlimm sein".

Gibt denn der Compiler auch eine richtige Fehlermeldung aus, oder erzeugt er am Ende eine ausführbare Datei?

#7482127
Lesenswert?
• ▲
▼

Joe schrieb:

:-( Gibt ganz neue Fehler. Fragt sich nur ich wie die jetzt wegbekomme.

isprint() braucht ein #include <ctype.h> am Anfang der Datei escp.cpp, also z.B.

1
/**
2
 * (C) A. Lang 2011
3
 * Licensed under GPL v3
4
 */
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <string.h>
8
#include <ctype.h>
9
#define alloc_blocksize 1024;
10
#define max_lines 512
11
#include "fnt5x7.h"
12
#include "fnt8x8.h"
#7482142
Lesenswert?
• ▲
▼

;-)

Zu meiner Verteidigung, das Semikolon stammt nicht von mir... aber du hast ja recht!

Also nochmal:

1
/*
2
 * (C) A. Lang 2011
3
 * Licensed under GPL v3
4
 */
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <string.h>
8
#include <ctype.h>
9
#define alloc_blocksize 1024
10
#define max_lines 512
11
#include "fnt5x7.h"
12
#include "fnt8x8.h"
Gast #7482332
Lesenswert?
• ▲
▼

Ganze Arbeit, jetzt sind es jede Menge Fehler. Spielen wir hier Schnitzeljagd?

gcc -O3 -Wall -Wextra -Wpedantic -o escp2img main.cpp escp.cpp $(pkg-config --cflags --libs imlib2) main.cpp: In function ‘int main(int, char**)’: main.cpp:91:14: warning: variable ‘input_set’ set but not used [-Wunused-but-set-variable] 91 | bool input_set=false; | ^~~~~~~~~ escp.cpp: In function ‘int copy_line()’: escp.cpp:47:23: error: ‘cc’ was not declared in this scope 47 | int copy_line() {if ((cc<32)||(cc>127)) { | ^~ escp.cpp:63:12: warning: empty parentheses were disambiguated as a function declaration [-Wvexing-parse] 63 | int newline() { | ^~ escp.cpp:63:12: note: remove parentheses to default-initialize a variable 63 | int newline() { | ^~ | -- escp.cpp:63:12: note: or replace parentheses with braces to value-initialize a variable escp.cpp:63:15: error: a function-definition is not allowed here before ‘{’ token 63 | int newline() { | ^ escp.cpp:75:78: error: a function-definition is not allowed here before ‘{’ token 75 | ite_line_data(int length, unsigned char * data, bool flip_data=false) { | ^

escp.cpp:89:34: error: a function-definition is not allowed here before ‘{’ token 89 | void write_char(unsigned char c) { | ^ escp.cpp💯34: error: a function-definition is not allowed here before ‘{’ token 100 | void fixme(const char * reason ) { | ^ escp.cpp:235:2: error: expected ‘}’ at end of input 235 | } | ^ escp.cpp:47:17: note: to match this ‘{’ 47 | int copy_line() {if ((cc<32)||(cc>127)) { | ^ escp.cpp:235:2: warning: control reaches end of non-void function [-Wreturn-type] 235 | }

Lasst es ganz einfach, ich versuche es lieber selbst.

#7482353
Lesenswert?
• ▲
▼

Joe schrieb:

Ganze Arbeit, jetzt sind es jede Menge Fehler. Spielen wir hier Schnitzeljagd?

Keine Ahnung, was du hier spielst.

Joe schrieb:

escp.cpp: In function ‘int copy_line()’: escp.cpp:47:23: error: ‘cc’ was not declared in this scope

Im weiter oben angehängten zip-File steht da in Zeile 47 was ganz anders.

Welche Version des Sourcecode versuchts du denn zu compilieren, und wo hast du die her?

Oliver

#7482367
Lesenswert?
• ▲
▼

Joe schrieb:

escp.cpp: In function ‘int copy_line()’: escp.cpp:47:23: error: ‘cc’ was not declared in this scope 47 | int copy_line() {if ((cc<32)||(cc>127)) { | ^~

Der Vergleich von "cc" erfolgt in einer Funktion nmanes "fixme", die Variable wird direkt in der Zeile über dem Vergleich definiert und initialisiert.

Was auch immmer Du da Deinem Compiler vorgesetzt hast, hat nichts mehr mit dem Quelltext von 2016 zu tun.

Was ist eigentlich Deine Erwartungshaltung?

#7482395
Lesenswert?
• ▲
▼

Anbei der Quelltext + Executable (Linux Amd64). Kompiliert bis auch eine Warnung. Die Warnung bekommt man raus, wenn man die Variable "input_set" komplett eliminiert. Sie wird nur 2x zugewiesen, aber nie geprüft.

1
laus@HPi7:~/src/esc2img/escp_git$ ./build.sh 
2
main.cpp: In function ‘int main(int, char**)’:
3
main.cpp:91:14: warning: variable ‘input_set’ set but not used [-Wunused-but-set-variable]
4
   91 |         bool input_set=false;
5
      |              ^~~~~~~~~
Angehängte Dateien:

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.