2012-07-14 30 views
14

Próbuję utworzyć prototyp do drukowania danych bitmapowych dla pliku tekstowego do mojej drukarki epson pos drukarki TM-T88V z obsługą sieci LAN.Rozliczanie cudzoziemców za pomocą drukarki POS i drukowanie obrazu

Chociaż nie mam problemów z wysłaniem instrukcji formatowania tekstu i tekstu, nie rozumiem, co muszę zrobić, aby drukarka wydrukowała dane z Arecibo message.

pierwsze kilka linijek:

00000010101010000000000 
00101000001010000000100 
10001000100010010110010 
10101010101010100100100 
00000000000000000000000 
00000000000011000000000 
00000000001101000000000 
00000000001101000000000 
00000000010101000000000 
00000000011111000000000 
00000000000000000000000 
11000011100011000011000 
10000000000000110010000 
11010001100011000011010 
11111011111011111011111 
00000000000000000000000 
00010000000000000000010 
00000000000000000000000 
00001000000000000000001 

Komunikat ma 73 wierszy i 23 kolumn powstałych w 1679 elementów obrazu. Każdy z tych elementów jest zdefiniowany jako 1 dla czerni lub 0 jako biały i powinien być wydrukowany jako kwadrat z 8x8 (lub 16x16) punktów. wynik skutkowałoby

Arecibo message http://www.satsig.net/seti/message-to-gliese-581.gif

ze specyfikacji drukarki:

enter image description here

Choć - jak już mówiłem - łączący i wysyłanie do drukarki ma problemu, po prostu nie dostać, co ta instrukcja chce mi powiedzieć. Co by było w przypadku komunikatu Arecibo:

Jakie numery muszę wysłać do drukarki? Czy muszę wysłać każdą kropkę? Co oznacza nL, nH specify the number of dots of the image data in the horizontal direction as (nL + nH × 256).?

Oto mój prosty program Python używam do prototypowania:

# -*- coding: utf-8 -*- 
import struct 
import socket 

def sendInstructions(mySocket,l): 
    for x in l: 
     mySocket.send(struct.pack('h', *[x]),1) 


def emphasizeOn(mySocket): 
    sendInstructions(mySocket,[27,33,48]) 


def emphasizeOff(mySocket): 
    sendInstructions(mySocket,[27,33,0]) 


def lineFeed(mySocket,number): 
    for i in range(number): 
     sendInstructions(mySocket,[0x0a,]) 


def paperCut(mySocket): 
    sendInstructions(mySocket,[29,86,0]) 

def sendText(mySocket,string): 
    mySocket.send(string.encode('UTF-8')) 


def main(): 
    mySocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
    mySocket.connect(('192.168.1.15',9100))  


    lines = ["Hello,","World!"] 
    emphasizeOff(mySocket) 
    lineFeed(mySocket,2) 
    for l in lines: 
     if lines.index(l) == 0: 
      emphasizeOn(mySocket) 
     else: 
      emphasizeOff(mySocket) 

     sendText(mySocket,l) 
     lineFeed(mySocket,2) 

    lineFeed(mySocket,4) 
    paperCut(mySocket) 

    mySocket.close() 

if __name__=="__main__": 
    main() 
+0

A co to ma do czynienia z obcymi rozliczeniowych? – LarsH

+1

+1 za fakturowanie obcokrajowców – Seth

+1

@LarsH - tylko po to, by zwrócić twoją uwagę:) ... Nie poważnie: muszę wydrukować dane bitmapowe, a ponieważ czułem, że muszę to zilustrować, pomyślałem o użyciu słynnego przykładu, wiadomości Arecibo . Ale co byś wysłał Obcego, jeśli masz drukarkę POS? Rachunki! – vikingosegundo

Odpowiedz

6

To polecenie generuje jedną poziomą listwę obrazu naraz. Pasek ma 8 lub 24 punkty wysokości, w zależności od wartości m.

nL i nH to niskie i wysokie bajty liczby całkowitej, które określają szerokość w punktach poziomego paska obrazu. Ta szerokość jest obliczana jako nL + nH * 256, więc jeśli chcesz, aby obraz miał 550 punktów szerokości, wtedy nH = 2 i nL = 38.

Argument d jest danymi bitmapowymi; jeśli pasek obrazu ma 8 kropek wysokości, to każdy bajt reprezentuje jedną kolumnę w pasku. Jeśli pasek ma 24 punkty wysokości, to trzy bajty reprezentują jedną kolumnę.

Więc powiedzmy, że masz Arecibo w numpy tablicy WXH o wskazówki, 1 lub 0. byś:

data = np.zeros((W, H), dtype=np.ubyte) 
## (fill in data here) 

## Use m=33 since this is apparently the only mode with 
## square pixels and also the highest resolution 
## (unless it prints too slowly for your liking) 
m = 33 

nH = W // 256 ## note this is integer division, but SO's 
       ## syntax hilighting thinks it looks like a comment. 
nL = W % 256 

## Divide the array into sections with shape Wx24: 
for n in range(data.shape[1] // 24): 
    ## Note that if the image height is not a multiple of 24, 
    ## you'll have to pad it with zeros somehow. 

    strip = data[:, n*24:(n+1)*24] 

    ## Convert each strip into a string of bytes: 

    strip = strip.reshape(W, 3, 8) 
    bytes = (strip * (2**np.arange(8)[np.newaxis, np.newaxis, :])).sum(axis=2) # magic 
    byteString = bytes.astype(np.ubyte).tostring() 

    ## Send the command to POS