くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2019年01月

Pythonでカスタマーバーコードの画像を生成する

Gitのリポジトリ

https://github.com/n79s/gencbar

帳票系のことをやる場合、カスバーの印刷は割と必要になる。

日本のカスバーってPythonでなかなかないので、

とりあえず、カスバー画像作るモジュールを用意。

下で郵政が公式に公開してるカスバー画像生成ツールのロジックを利用。

https://www.post.japanpost.jp/useful_tool/barcode/index.html

javascriptで一文字づつgif画像貼ってるだけで、大したロジックじゃなかったので、

これをPythonでできるようにした感じ。

住所の文字列からカスバー用のバーコード文字を抜き出すやつも入れた。

https://www.post.japanpost.jp/zipcode/zipmanual/p25.html

↑とかに出てるような住所であればコードの内容は一致してる。

「三番町」とか「八丁堀」とかの住所でも上手くいくようにしてるつもり。

郵政のロジックだと郵便番号に該当する住所は変換の対象にしないんだけど、

郵便番号に対応する住所除くのって、住所マスタみたいなのないと不可能なので、

住所のみからどうにか出来ないかやってみた感じ。

多分100%じゃないと思うんだけど、今のところダメになるパターンの

住所は見つけられてない。

出来る上がるバーコードの見た目は問題ないと思うんだけど。。。

あと、実際に郵便局に持ち込んで読み取りテストとか今度しておこ。

Python 画像データ⇔文字列にする

Pythonで画像データのバイナリを文字列として取得したり、

逆にバイナリの文字列から画像データを起こしたりしたい場合。

Pillowを使用。

import io
from PIL import Image

#バイナリにしたい画像を読み込み
tmpimg = Image.open("./imgs/-.png")
with io.BytesIO() as output:
    tmpimg.save(output,format="PNG")
    contents = output.getvalue()#バイナリ取得
    print(contents)#表示
    tmpimg2 = Image.open(io.BytesIO(contents))#バイナリから画像に変換
    tmpimg2.save('image_from_str.png')

#バイナリ文字列としてやる場合はこんな感じ
imgbytes_str = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x0c\x00\x00\x00\x0c\x01\x03\x00\x00\x00l\xbb\xce\xa4\x00\x00\x00\x06PLTE\x00\x00\x00\xff\xff\xff\xa5\xd9\x9f\xdd\x00\x00\x00\x13IDATx\x9cc\xf8\xfc\x81\x01\x8e\x8c\r\x10\x08I\x1c\x00+\xcd\x10\xa5\xa0\xa1\xbf,\x00\x00\x00\x00IEND\xaeB`\x82'
img_from_str = Image.open(io.BytesIO(imgbytes_str))
img_from_str.save('image_from_str2.png')
問合せ