14

テキストファイルのビットマップデータをLAN対応のepsonposプリンターTM-T88Vに印刷するためのプロトタイプを作成しようとしています。

テキストとテキストの書式設定の指示を送信するのに問題はありませんが、プリンターにアレシボメッセージのデータを印刷させるために何をしなければならないのか理解できません。

最初の数行:

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

メッセージには73行23列があり、1679の画像要素になります。この各要素は、黒の場合は1、白の場合は0で定義され、8x8(または16x16)ドットの正方形として印刷する必要があります。結果は次のようになります

アレシボメッセージ
(出典:satsig.net

プリンタの仕様から:

ここに画像の説明を入力してください

私が言ったように、プリンターへの接続と送信は問題ありませんが、この指示が私に伝えたいことを私は理解していません。アレシボメッセージの場合はどうなりますか

プリンターに送信する必要のある番号は何ですか?すべてのドットを送信する必要がありますか?どういうnL, nH specify the number of dots of the image data in the horizontal direction as (nL + nH × 256).意味ですか?

これが私がプロトタイピングに使用する私の単純なPythonプログラムです:

# -*- 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()
4

1 に答える 1

7

このコマンドは、一度に 1 つのイメージの水平ストリップを生成します。m の値に応じて、ストリップの高さは 8 ドットまたは 24 ドットになります。

nL と nH は、イメージの水平ストリップの幅をドット単位で指定する整数の下位バイトと上位バイトです。その幅は nL + nH * 256 として計算されるため、イメージの幅を 550 ドットにしたい場合は、nH=2 および nL=38 になります。

引数 d はビットマップ データです。イメージ ストリップの高さが 8 ドットの場合、各バイトはストリップの 1 列を表します。ストリップの高さが 24 ドットの場合、3 バイトが 1 列を表します。

1 または 0 の WxH numpy 配列に arecibo があるとします。次のようになります。

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
于 2012-07-14T03:15:18.987 に答える