Forum: PC-Programmierung ESC/P nach PNG


von Andreas L. (andi84)


Angehängte Dateien:

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

: Verschoben durch User
von Michael (Gast)


Lesenswert?

Der Link auf's Git funktioniert leider nicht.

Gruß
Michael

von Georg (Gast)


Lesenswert?

Michael schrieb:
> Der Link auf's Git funktioniert leider nicht.

Ist ja auch schon 5 Jahre alt (Das Oszi ist noch viel älter).

Georg

von Andreas L. (andi84)


Angehängte Dateien:

Lesenswert?

Stimmt,

das git ist nicht mehr online (das wollte ich eigentlich mal behoben 
haben...)

Den letzten Stand hab ich mal in einem .zip beigefügt.
Als Build-System kommt inzwischen qmake zum Einsatz (wodurch man einfach 
den qtcreator dafür nutzen kann, das Programm zu bauen)

Grüße
Andreas

von X. H. (shadow0815)


Lesenswert?

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.

von Joe (Gast)


Angehängte Dateien:

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.

von Harald K. (kirnbichler)


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)) {

von Joe (Gast)


Lesenswert?

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

von Harald K. (kirnbichler)


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?

von Klaus R. (klausro)


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"

von Harald K. (kirnbichler)


Lesenswert?

Klaus R. schrieb:
> #define alloc_blocksize 1024;

Seufz.

von Klaus R. (klausro)


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"

: Bearbeitet durch User
von Joe (Gast)


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:100: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.

von Oliver S. (oliverso)


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

von Harald K. (kirnbichler)


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?

von Klaus R. (klausro)


Angehängte Dateien:

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
      |              ^~~~~~~~~

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.