FX-890P+FP-40で画像データ印刷してみたテスト #カシオ #ポケコン pic.twitter.com/K1I5Ogn9iY
— MobileFF (@mobile_FF_) September 5, 2020
前のエントリでFP-40をプログラムから動かしましたが、このときに、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ビットの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形式の画像は画像データでありながらテキスト形式で記録されるので、中の人のような下手くそ素人プログラミングでも、どうにかちょっと頑張れば変換させることができました。
変換用のページもつくってみましたので、ご参考までに。
中の人は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
コメント
コメントを投稿