2012-07-14 13 views
14

Tôi đang cố gắng tạo mẫu thử in dữ liệu bitmap cho tệp văn bản vào mạng LAN của tôi đã bật máy in epson pos TM-T88V.Người ngoài hành tinh thanh toán qua máy in POS và in ảnh

Trong khi tôi không gặp vấn đề gì khi gửi hướng dẫn định dạng văn bản và văn bản, tôi không hiểu, tôi phải làm gì, để máy in in dữ liệu của Arecibo message.

đầu tiên vài dòng:

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

Thông điệp có 73 hàng và 23 cột kết quả là 1679 các yếu tố hình ảnh. Mỗi phần tử này được xác định bằng 1 cho màu đen hoặc 0 là màu trắng và sẽ được in dưới dạng hình vuông có 8x8 (hoặc 16x16) chấm. kết quả sẽ dẫn đến

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

Từ thông số kỹ thuật của máy in:

enter image description here

Trong khi - như tôi đã nói - các kết nối và gửi tới máy in được không có vấn đề, tôi chỉ không nhận được, những gì hướng dẫn này muốn nói với tôi. Điều gì sẽ xảy ra trong trường hợp của thông điệp Arecibo là

Tôi phải gửi số điện thoại nào cho máy in? Tôi có cần gửi mọi dấu chấm không? nL, nH specify the number of dots of the image data in the horizontal direction as (nL + nH × 256). là gì?

Đây là chương trình Python đơn giản của tôi, tôi sử dụng cho prototyping:

# -*- 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

Và điều này có phải làm gì với người ngoài hành tinh thanh toán? – LarsH

+1

+1 cho người ngoài hành tinh thanh toán – Seth

+1

@LarsH - chỉ để tăng sự chú ý của bạn:) ... Không nghiêm túc: Tôi cần in dữ liệu bitmap và khi tôi cảm thấy cần minh họa điều đó, tôi đã nghĩ đến việc sử dụng một ví dụ nổi tiếng, thông điệp Arecibo . Nhưng những gì bạn sẽ gửi một người nước ngoài, nếu bạn chúng tôi một máy in POS? Hóa đơn! – vikingosegundo

Trả lời

6

Lệnh này tạo ra một dải ngang của hình ảnh cùng một lúc. Dải có chiều cao 8 hoặc 24, tùy thuộc vào giá trị của m.

nL và nH là các byte thấp và cao của một số nguyên chỉ định chiều rộng trong các chấm của dải ngang của hình ảnh. Chiều rộng đó được tính là nL + nH * 256, vì vậy nếu bạn muốn hình ảnh rộng 550 điểm, thì nH = 2 và nL = 38.

Đối số d là dữ liệu bitmap; nếu dải hình ảnh cao 8 điểm, thì mỗi byte đại diện cho một cột trong dải. Nếu dải có chiều cao 24 chấm thì ba byte đại diện cho một cột.

Vì vậy, giả sử bạn có arecibo trong một mảng NumPy RxC ints, 1 hoặc 0. Bạn sẽ:

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