プチコンまとめWiki (初代/mkII)

投稿プログラム : QRコード作成

パンくずリスト

2011年04月24日投稿 / 投稿者 : 名無しさん / タグ : 投稿プログラム 実用ツール 初代対応 QRコード

概要

与えられた文字列からQRコードを作成します。
ただし、バージョン10、誤り訂正レベルL、8ビットバイトモード、マスクパターン011固定です。

LINPUTの仕様で32文字までしか入力できませんが、実際には271文字まで変換可能です。
(プチコンの文字数制限を超えているので、フルに使うのは難しいですが)

なお、作成に当たっては、こちらのサイトを参考にさせていただきました。

出力するQRコードの変更

プログラムの最初の方の数値を修正することで、モード以外は変更できるようになっています。
詳細はQRコードの仕様(JISX0510、閲覧のみならJISCのページから可能)を参照してください。

変数名行番号内容
VER2バージョン
ECL2誤り訂正レベル(ビット順を逆にする)
MASK2マスクパターン(ビット順を逆にする)
TOTAL3総コード語数
RSB3RSブロック数
ECW3RSブロックごとの誤り訂正コード語数
F(I)8生成多項式のαの指数
VINF12型番情報(必要ない場合は0)
APC12位置合わせパターンの中心の行座標数(必要ない場合は1)
P(I)17位置合わせパターンの中心の行座標(必要ない場合は6)

特に、マスクパターンについては、本来であれば自動的に調整されるべき項目なので、
認識率が悪いようであれば0〜7の間で変えてください。

一応、JISX0510から設定内容を調べる方法を簡単に説明します。

  1. QRコード化したい文字数の確認。
    例えば、MEM$を保存したいなら256文字
  2. 表7〜10から、希望の8ビットバイト文字数が入る型番(バージョン)と誤り訂正レベルを調べる。
    271文字入る「バージョン10、誤り訂正レベルL」を選択(VER=10)
  3. 表12〜18から、バージョンと誤り訂正レベルに対応する総コード語数、RSブロック数、RSブロックごとの誤り訂正コード語数を調べる。
    「バージョン10、誤り訂正レベルL」から、TOTAL=346、RSB=2+2=4、ECW=72/4=18
  4. 表20からマスクパターンを、表22から誤り訂正レベルを調べ、ビット順を逆にする。
    マスクパターンはとりあえず&B011、誤り訂正レベルはLだから&B01だが、ビット順を逆にするので MASK=&B110、ECL=&B10
  5. 附属書A表1〜5から、誤り訂正コード語数ECWに対応する生成多項式を見つけ、αの指数を抜き出す。
    ECW=18なので、F(I)=215,234,...,96,153
  6. 附属書D表1から、バージョンに対応する型番情報を調べる。
    VER=10なので、VINF=&H0A4D3
  7. 附属書E表1から、バージョンに対応する位置合わせパターンの中心の行座標を調べる。APCは座標の数。
    VER=10なので、P(I)=6,28,50、APC=3

スクリーンショット・動画

ありません。

QR コード

プチコンmkII 向けの QR コードです。

1/32/3
qr0.pngqr1.png
3/3-
qr2.png

作ったQRコード載せ場

プログラムリスト

  • 2011/04/25 (月) 20:02:40 2次元配列を使うのをやめて、プログラムを少し短くしました
  • 2011/05/02 (月) 22:53:08 最大文字数まで入れるとエラーになるバグ修正と、認識しやすいように拡大処理追加
  1. CLEAR
  2. VER=10:ECL=2:MASK=6
  3. TOTAL=346:RSB=4:ECW=18
  4. DIM F(ECW)
  5. FOR I=0 TO ECW−1
  6.  READ F(I)
  7. NEXT
  8. DATA 215,234,158,94,184
  9. DATA 97,118,170,79,187
  10. DATA 152,148,252,179,5
  11. DATA 98,96,153
  12. VINF=&H0A4D3:APC=3
  13. DIM P(APC)
  14. FOR I=0 TO APC−1
  15.  READ P(I)
  16. NEXT
  17. DATA 6,28,50
  18. CCI=1+(VER>=10):SIZE=17+VER*4
  19. DW=FLOOR(TOTAL/RSB)−ECW
  20. MAG=FLOOR(192/(SIZE+8))
  21. OX=FLOOR((256−SIZE*MAG)/2)
  22. OY=FLOOR((192−SIZE*MAG)/2)
  23. DIM D(TOTAL−ECW*RSB+1),O(TOTAL),T(DW+ECW+1),BI(RSB)
  24. BI(0)=0:BIC=RSB−TOTAL%RSB
  25. FOR I=1 TO RSB−1
  26.  BI(I)=BI(I−1)+DW+(I−1>=BIC)
  27. NEXT
  28. DIM EI(255),IE(256)
  29. EI(0)=1
  30. FOR I=1 TO 254
  31.  EI(I)=EI(I−1)*2
  32.  IF EI(I)>=256 THEN EI(I)=(EI(I)−256) XOR &H1D
  33. NEXT
  34. FOR I=0 TO 254
  35.  IE(EI(I))=I
  36. NEXT
  37. LINPUT ”?”;A$
  38. L=LEN(A$)
  39. D(0)=4
  40. D(1)=FLOOR(L/256)
  41. D(CCI)=L%256
  42. FOR I=0 TO L−1
  43.  D(I+CCI+1)=ASC(MID$(A$,I,1))
  44. NEXT
  45. FOR I=0 TO L+CCI
  46.  D(I)=(D(I)*16+FLOOR(D(I+1)/16))%256
  47. NEXT
  48. FOR I=1 TO TOTAL−ECW*RSB−L−CCI−1
  49.  D(L+I+CCI)=&H11+(I%2==1)*(&HEC−&H11)
  50. NEXT
  51. I=0
  52. FOR J=0 TO DW−1
  53.  FOR K=0 TO RSB−1
  54.   O(I)=D(BI(K)+J):I=I+1
  55.  NEXT
  56. NEXT
  57. FOR K=BIC TO RSB−1
  58.  O(I)=D(BI(K)+J):I=I+1
  59. NEXT
  60. FOR I=0 TO RSB−1
  61.  L=DW+(I>=BIC)
  62.  FOR J=0 TO L−1
  63.   T(J)=D(BI(I)+J)
  64.  NEXT
  65.  FOR J=0 TO ECW−1
  66.   T(J+L)=0
  67.  NEXT
  68.  FOR J=0 TO L−1
  69.   IF T(J)==0 GOTO @SKIP1
  70.   E=IE(T(J))
  71.   FOR K=0 TO ECW−1
  72.    T(J+K+1)=T(J+K+1) XOR EI((F(K)+E)%255)
  73.   NEXT
  74.   @SKIP1
  75.  NEXT
  76.  FOR J=0 TO ECW−1
  77.   O(TOTAL−(ECW−J)*RSB+I)=T(J+L)
  78.  NEXT
  79. NEXT
  80. VISIBLE 1,1,0,0,0,0
  81. GCLS &H1E
  82. GFILL OX,OY,OX+SIZE−1,OY+SIZE−1,&H0F
  83. GFILL OX  ,OY  ,OX+8,OY+8,&H1E
  84. GBOX  OX  ,OY  ,OX+6,OY+6,&H1F
  85. GFILL OX+2,OY+2,OX+4,OY+4,&H1F
  86. GFILL OX+SIZE−8,OY  ,OX+SIZE−1,OY+8,&H1E
  87. GBOX  OX+SIZE−7,OY  ,OX+SIZE−1,OY+6,&H1F
  88. GFILL OX+SIZE−5,OY+2,OX+SIZE−3,OY+4,&H1F
  89. GFILL OX  ,OY+SIZE−8,OX+8,OY+SIZE−1,&H1E
  90. GBOX  OX  ,OY+SIZE−7,OX+6,OY+SIZE−1,&H1F
  91. GFILL OX+2,OY+SIZE−5,OX+4,OY+SIZE−3,&H1F
  92. FOR I=8 TO SIZE−9
  93.  GPSET OX+I,OY+6,&H1E+(I%2==0)
  94.  GPSET OX+6,OY+I,&H1E+(I%2==0)
  95. NEXT
  96. GPSET OX+8,OY+SIZE−8,&H1F
  97. FOR I=0 TO APC−1
  98.  FOR J=0 TO APC−1
  99.   IF(I==0 AND J==0)OR(I==0 AND J==APC−1)OR(I==APC−1 AND J==0)GOTO @SKIP2
  100.   GBOX OX+P(I)−2,OY+P(J)−2,OX+P(I)+2,OY+P(J)+2,&H1F
  101.   GBOX OX+P(I)−1,OY+P(J)−1,OX+P(I)+1,OY+P(J)+1,&H1E
  102.   GPSET OX+P(I),OY+P(J),&H1F
  103.   @SKIP2
  104.  NEXT
  105. NEXT
  106. IF VER<7 GOTO @SKIP3
  107. D=VINF
  108. FOR I=0 TO 17
  109.  GPSET OX+SIZE−11+I%3,OY+I/3,&H1E+(D AND 1)
  110.  GPSET OX+I/3,OY+SIZE−11+I%3,&H1E+(D AND 1)
  111.  D=FLOOR(D/2)
  112. NEXT
  113. @SKIP3
  114. X=SIZE−2:Y=SIZE:F=1:D=−1
  115. FOR I=0 TO TOTAL−1
  116.  J=128
  117.  @LOOP1
  118.   @LOOP2
  119.    X=X+F*2−1:Y=Y+F*D:F=1−F
  120.    IF Y<0 THEN Y=0:X=X−2:D=1
  121.    IF Y>=SIZE THEN Y=SIZE−1:X=X−2:D=−1
  122.    IF X==6 THEN X=X−1
  123.   IF GSPOIT(OX+X,OY+Y)!=&H0F GOTO @LOOP2
  124.   IF O(I) AND J THEN GPSET OX+X,OY+Y,&H0E
  125.   J=J/2
  126.  IF J>=1 GOTO @LOOP1
  127. NEXT
  128. FOR I=0 TO SIZE−1
  129.  FOR J=0 TO SIZE−1
  130.   ON MASK GOSUB @0,@4,@2,@6,@1,@5,@3,@7
  131.   C=GSPOIT(OX+J,OY+I)
  132.   IF C<&H10 AND A THEN GPSET OX+J,OY+I,C XOR 1
  133.  NEXT
  134. NEXT
  135. D=MASK*4+ECL:T=D
  136. FOR I=0 TO 4
  137.  IF T AND 1 THEN T=T XOR &H765
  138.  T=T/2
  139. NEXT
  140. D=D+T*32 XOR &H2415
  141. X=0:Y=SIZE−1
  142. FOR I=0 TO 14
  143.  GPSET OX+X,OY+8,&H1E+(D AND 1)
  144.  GPSET OX+8,OY+Y,&H1E+(D AND 1)
  145.  X=X+1+(X==5):Y=Y−1−(Y==7)
  146.  IF X==8 THEN X=SIZE−8:Y=8
  147.  D=FLOOR(D/2)
  148. NEXT
  149.  
  150. FOR I=SIZE−1 TO 0 STEP −1
  151.  Y=OY+I*MAG
  152.  FOR J=SIZE−1 TO 0 STEP −1
  153.   X=OX+J*MAG
  154.   GFILL X,Y,X+MAG−1,Y+MAG−1,GSPOIT(OX+J,OY+I)
  155.  NEXT
  156. NEXT
  157.  
  158. VISIBLE 0,1,0,0,0,1
  159. FOR I=0 TO 1:I=BUTTON()!=0:NEXT
  160. GCLS 0:VISIBLE 1,1,1,1,1,1:END
  161. @0
  162. A=(I+J)%2==0:RETURN
  163. @1
  164. A=I%2==0:RETURN
  165. @2
  166. A=J%3==0:RETURN
  167. @3
  168. A=(I+J)%3==0:RETURN
  169. @4
  170. A=(FLOOR(I/2)+FLOOR(J/3))%2==0:RETURN
  171. @5
  172. A=I*J%2+I*J%3==0:RETURN
  173. @6
  174. A=(I*J%2+I*J%3)%2==0:RETURN
  175. @7
  176. A=(I*J%3+(I+J)%2)%2==0:RETURN

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.036 秒 | このページの最終更新 : 2013/06/28 (金) 22:24:12 (2361d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30