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

Toukou/QRコード作成 の変更点

パンくずリスト


#title(投稿プログラム : QRコード作成)
#contents
/////////////////////////////////
// 適当にタグをつけることができます。半角のコンマ区切りで複数つけられます。
// タグをつけると、同じタグが付いたページを検索することができます。

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

/////////////////////////////////
// ここに概要とか書きます。

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

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

なお、作成に当たっては、[[こちらのサイト:http://www.swetake.com/qr/]]を参考にさせていただきました。

** 出力するQRコードの変更 [#eefe2929]
プログラムの最初の方の数値を修正することで、モード以外は変更できるようになっています。~
詳細はQRコードの仕様(JISX0510、閲覧のみなら[[JISCのページ:http://www.jisc.go.jp/]]から可能)を参照してください。

|~変数名|~行番号|~内容|
|~VER|RIGHT:2|バージョン|
|~ECL|RIGHT:2|誤り訂正レベル(ビット順を逆にする)|
|~MASK|RIGHT:2|マスクパターン(ビット順を逆にする)|
|~TOTAL|RIGHT:3|総コード語数|
|~RSB|RIGHT:3|RSブロック数|
|~ECW|RIGHT:3|RSブロックごとの誤り訂正コード語数|
|~F(I)|RIGHT:8|生成多項式のαの指数|
|~VINF|RIGHT:12|型番情報(必要ない場合は0)|
|~APC|RIGHT:12|位置合わせパターンの中心の行座標数(必要ない場合は1)|
|~P(I)|RIGHT:17|位置合わせパターンの中心の行座標(必要ない場合は6)|

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

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

/////////////////////////////////

* スクリーンショット・動画 [#e411ab30]
ありません。


/////////////////////////////////

* QR コード [#f61b5601]
プチコンmkII 向けの QR コードです。


|~1/3|~2/3|
|&ref(qr0.png,,200%);|&ref(qr1.png,,200%);|
|~3/3|~-|
|&ref(qr2.png,,200%);||

**作ったQRコード載せ場 [#z157d027]

/////////////////////////////////

* プログラムリスト [#c662ffe4]
- 2011/04/25 (月) 20:02:40 2次元配列を使うのをやめて、プログラムを少し短くしました
- 2011/05/02 (月) 22:53:08 最大文字数まで入れるとエラーになるバグ修正と、認識しやすいように拡大処理追加

#basic{{
CLEAR
VER=10:ECL=2:MASK=6
TOTAL=346:RSB=4:ECW=18
DIM F(ECW)
FOR I=0 TO ECW-1
 READ F(I)
NEXT
DATA 215,234,158,94,184
DATA 97,118,170,79,187
DATA 152,148,252,179,5
DATA 98,96,153
VINF=&H0A4D3:APC=3
DIM P(APC)
FOR I=0 TO APC-1
 READ P(I)
NEXT
DATA 6,28,50

CCI=1+(VER>=10):SIZE=17+VER*4
DW=FLOOR(TOTAL/RSB)-ECW
MAG=FLOOR(192/(SIZE+8))
OX=FLOOR((256-SIZE*MAG)/2)
OY=FLOOR((192-SIZE*MAG)/2)
DIM D(TOTAL-ECW*RSB+1),O(TOTAL),T(DW+ECW+1),BI(RSB)
BI(0)=0:BIC=RSB-TOTAL%RSB
FOR I=1 TO RSB-1
 BI(I)=BI(I-1)+DW+(I-1>=BIC)
NEXT
DIM EI(255),IE(256)
EI(0)=1
FOR I=1 TO 254
 EI(I)=EI(I-1)*2
 IF EI(I)>=256 THEN EI(I)=(EI(I)-256) XOR &H1D
NEXT
FOR I=0 TO 254
 IE(EI(I))=I
NEXT

LINPUT "?";A$
L=LEN(A$)
D(0)=4
D(1)=FLOOR(L/256)
D(CCI)=L%256
FOR I=0 TO L-1
 D(I+CCI+1)=ASC(MID$(A$,I,1))
NEXT
FOR I=0 TO L+CCI
 D(I)=(D(I)*16+FLOOR(D(I+1)/16))%256
NEXT
FOR I=1 TO TOTAL-ECW*RSB-L-CCI-1
 D(L+I+CCI)=&H11+(I%2==1)*(&HEC-&H11)
NEXT

I=0
FOR J=0 TO DW-1
 FOR K=0 TO RSB-1
  O(I)=D(BI(K)+J):I=I+1
 NEXT
NEXT
FOR K=BIC TO RSB-1
 O(I)=D(BI(K)+J):I=I+1
NEXT

FOR I=0 TO RSB-1
 L=DW+(I>=BIC)
 FOR J=0 TO L-1
  T(J)=D(BI(I)+J)
 NEXT
 FOR J=0 TO ECW-1
  T(J+L)=0
 NEXT
 FOR J=0 TO L-1
  IF T(J)==0 GOTO @SKIP1
  E=IE(T(J))
  FOR K=0 TO ECW-1
   T(J+K+1)=T(J+K+1) XOR EI((F(K)+E)%255)
  NEXT
  @SKIP1
 NEXT
 FOR J=0 TO ECW-1
  O(TOTAL-(ECW-J)*RSB+I)=T(J+L)
 NEXT
NEXT

VISIBLE 1,1,0,0,0,0
GCLS &H1E
GFILL OX,OY,OX+SIZE-1,OY+SIZE-1,&H0F

GFILL OX  ,OY  ,OX+8,OY+8,&H1E
GBOX  OX  ,OY  ,OX+6,OY+6,&H1F
GFILL OX+2,OY+2,OX+4,OY+4,&H1F
GFILL OX+SIZE-8,OY  ,OX+SIZE-1,OY+8,&H1E
GBOX  OX+SIZE-7,OY  ,OX+SIZE-1,OY+6,&H1F
GFILL OX+SIZE-5,OY+2,OX+SIZE-3,OY+4,&H1F
GFILL OX  ,OY+SIZE-8,OX+8,OY+SIZE-1,&H1E
GBOX  OX  ,OY+SIZE-7,OX+6,OY+SIZE-1,&H1F
GFILL OX+2,OY+SIZE-5,OX+4,OY+SIZE-3,&H1F

FOR I=8 TO SIZE-9
 GPSET OX+I,OY+6,&H1E+(I%2==0)
 GPSET OX+6,OY+I,&H1E+(I%2==0)
NEXT
GPSET OX+8,OY+SIZE-8,&H1F

FOR I=0 TO APC-1
 FOR J=0 TO APC-1
  IF(I==0 AND J==0)OR(I==0 AND J==APC-1)OR(I==APC-1 AND J==0)GOTO @SKIP2
  GBOX OX+P(I)-2,OY+P(J)-2,OX+P(I)+2,OY+P(J)+2,&H1F
  GBOX OX+P(I)-1,OY+P(J)-1,OX+P(I)+1,OY+P(J)+1,&H1E
  GPSET OX+P(I),OY+P(J),&H1F
  @SKIP2
 NEXT
NEXT

IF VER<7 GOTO @SKIP3
D=VINF
FOR I=0 TO 17
 GPSET OX+SIZE-11+I%3,OY+I/3,&H1E+(D AND 1)
 GPSET OX+I/3,OY+SIZE-11+I%3,&H1E+(D AND 1)
 D=FLOOR(D/2)
NEXT
@SKIP3

X=SIZE-2:Y=SIZE:F=1:D=-1
FOR I=0 TO TOTAL-1
 J=128
 @LOOP1
  @LOOP2
   X=X+F*2-1:Y=Y+F*D:F=1-F
   IF Y<0 THEN Y=0:X=X-2:D=1
   IF Y>=SIZE THEN Y=SIZE-1:X=X-2:D=-1
   IF X==6 THEN X=X-1
  IF GSPOIT(OX+X,OY+Y)!=&H0F GOTO @LOOP2
  IF O(I) AND J THEN GPSET OX+X,OY+Y,&H0E
  J=J/2
 IF J>=1 GOTO @LOOP1
NEXT

FOR I=0 TO SIZE-1
 FOR J=0 TO SIZE-1
  ON MASK GOSUB @0,@4,@2,@6,@1,@5,@3,@7
  C=GSPOIT(OX+J,OY+I)
  IF C<&H10 AND A THEN GPSET OX+J,OY+I,C X
  IF C<&H10 AND A THEN GPSET OX+J,OY+I,C XOR 1
 NEXT
NEXT

D=MASK*4+ECL:T=D
FOR I=0 TO 4
 IF T AND 1 THEN T=T XOR &H765
 T=T/2
NEXT
D=D+T*32 XOR &H2415
X=0:Y=SIZE-1
FOR I=0 TO 14
 GPSET OX+X,OY+8,&H1E+(D AND 1)
 GPSET OX+8,OY+Y,&H1E+(D AND 1)
 X=X+1+(X==5):Y=Y-1-(Y==7)
 IF X==8 THEN X=SIZE-8:Y=8
 D=FLOOR(D/2)
NEXT
 
FOR I=SIZE-1 TO 0 STEP -1
 Y=OY+I*MAG
 FOR J=SIZE-1 TO 0 STEP -1
  X=OX+J*MAG
  GFILL X,Y,X+MAG-1,Y+MAG-1,GSPOIT(OX+J,OY+I)
 NEXT
NEXT
 
VISIBLE 0,1,0,0,0,1
FOR I=0 TO 1:I=BUTTON()!=0:NEXT
GCLS 0:VISIBLE 1,1,1,1,1,1:END

@0
A=(I+J)%2==0:RETURN
@1
A=I%2==0:RETURN
@2
A=J%3==0:RETURN
@3
A=(I+J)%3==0:RETURN
@4
A=(FLOOR(I/2)+FLOOR(J/3))%2==0:RETURN
@5
A=I*J%2+I*J%3==0:RETURN
@6
A=(I*J%2+I*J%3)%2==0:RETURN
@7
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.013 秒 | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30