[今更誰得] FP-40で画像データを印刷してみる #カシオ #ポケコン



前のエントリでFP-40をプログラムから動かしましたが、このときに、FP-40でグラフィック印刷ができることにちょっと驚きまして。

mobileFF's blog: [今更誰得] FP-40で印刷機能付きのゲームプログラムを実行してみた #カシオ #ポケコン 


上のエントリを書いた後で、FP-40の説明書を確認したら、確かにイメージデータを印刷するエスケープシーケンスがありました。

FP-40でドットイメージを印字するためのエスケープシーケンス


① ラインフィードの長さを調整する

ESC A [8/12]

[ ]の数値は8を指定すると1/9インチ、12を指定すると1/6インチのフィード長になります。デフォルトは1/6ですが、イメージデータは行間を詰める必要があるので1/9に設定します。

コード例

LPRINT CHR$(27);"A";CHR$(8);
		


② ドットイメージ印刷を設定する

ESC K+[n1]+[n2]

  • [n1]は横に何ビット分印刷するかの値で、0~255まで指定できます。[n2]で倍精度モードにすれば512ビットまで指定可能です。
  • [n2]は印刷モードの指定で、0は単精度(1行あたり256ビットまで)、1は倍精度(1行あたり512ビットまで)となります。
  • このあとに、ビットイメージをCHR$( )の引数に指定してLPRINTするとビットイメージが印刷されます。
コード例(印刷モードを切り替える部分のみ)

LPRINT CHR$(27);"K";CHR$(64);CHR$(0);
		


③ 改行する

空のLPRINT文を実行すれば改行されます。

イメージデータのつくりかた

FP-40で印字するためのイメージデータは縦に8ドットごとに2進数としてデータ化します。2進数で1のところが黒(印字する)、0のところが白(印字しない)です。

たとえば、↓のような画像の場合、


縦8ドットを左から順に数値化していくわけです。まずは縦0~7行目の0列目を次のように2進数にします。


縦は一番上が上位ビット、そこから下位ビットへ8ビットの2進数(0が非印字、1が印字)とします。これがFP-40での印刷の最小単位です。
これを16進数として記載していきます。


次は隣の列ですのでこんな感じです。


という調子でデータ化していくわけです。

元画像を準備する

FP-40はモノクロプリンタですから、カラー画像もグレースケール画像も印刷できません。いわゆる白と黒の2色しかない、2値画像を用意しなければいけません。

また、画像の大きさは横256ビット(倍精度にすれば512でも行けますが、縦横比が狂いますから難しいと思います)にしてください。縦は本当は何ビットでもいいんですが、サンプルプログラムでは256ビット前提で作ってますので、とりあえずで試される場合は256x256にしてください。

単純にフルカラーの画像を2値画像に変換すると結構残念な感じの影絵のようになってしまうので、


フルカラー
直接2値画像に変換すると
だいたいこんな感じになります


もしツール側で対応していれば、ですが、フルカラー → 16色 → 2値と段階的に減色して変換すれば、少しそれっぽい感じになるかもしれません。この辺はすいません、専門家じゃないのでよくわかりません。

フルカラー
16色
2値画像

これまたツールが対応していないとダメですが、変換後の2値画像をXPM形式という形式で保存してください。

さすがに、全て手動で画像を上記のFP-40用のイメージデータに変換していく・・・というわけにもいかないわけで、どうしようかとなるのですが、実はXPM形式の画像は画像データでありながらテキスト形式で記録されるので、中の人のような下手くそ素人プログラミングでも、どうにかちょっと頑張れば変換させることができました。

変換用のページもつくってみましたので、ご参考までに。

mobileFF's blog: XPMデータ(2値画像)をFP-40印刷用イメージデータに変換 https://mobileff.blogspot.com/p/xpm2fp-40.html

中の人はXPM形式のことはまるでわからないのですが、!と空白で0と1を表現するような設定になっているのですが、ツールによって異なる可能性もありそうなので、#000000や#FFFFFFが何に割当たっているかは手動でご入力ください。

そして、出来たイメージデータをテキストファイルとして保存します。

プログラムとイメージデータをポケコンに転送

そうでした、書き忘れましたがプログラムはFX-890Pで動作確認しています。FX-870P/VX-4あたりはBASIC互換性があるので問題ないと思いますが、860系はちょっとわからないです。

画像表示用のプログラムをポケコンに転送してください。リストは↓です。プログラムエリアはどこでも大丈夫です。

1000 REM PRINT IMAGE
1010 LPRINT CHR$(27);"A";CHR$(8);
1020 INPUT "FILE AREA(0-9)?",F
1030 PRINT "F"+RIGHT$(STR$(F),1)
1040 RESTORE#("F"+RIGHT$(STR$(F),1))
1050 FOR I=1 TO 32
1060   PRINT "PRINTING LINE:";(I-1)*8;"-";(I*8)-1
1070   FOR J=1 TO 4
1080     READ# A$
1190     LPRINT CHR$(27);"K";CHR$(64);CHR$(0);
1100     FOR K=0 TO 63
1110       B$=MID$(A$,K*2+1,2)
1120       LPRINT CHR$(VAL("&H"+B$));
1130     NEXT K
1140   NEXT J
1150   LPRINT
1160 NEXT I
1170 LPRINT "fin."
1180 END
		

※印刷イメージの表示には、PBロッキーさん(https://blog.pb-100.ga/)作の"hamura.css"(https://github.com/PB-100/hamura.css)を利用させていただいています。



次に、イメージデータのテキストファイルをポケコンのファイルエリアのどこか空いているところ(F0~F9のどこか)に転送してください。

で、転送が終わりましたらポケコンにFP-40を繋いで、プログラムを実行しますと、ファイルエリア番号の入力を求められますので、さきほど転送したファイルエリア番号を入力してEXE押下しますと、FP-40で一生懸命印刷が始まります。256x256の画像でも、かなーり時間がかかりますが、気長に待ちましょうw

一生懸命、印刷していきますw

うん、何のためにやっているのか?そういう質問は受け付けません!w
昭和のテクノロジーで令和の写真をアウトプットできる、というロマンですねw




コメント