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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren