2011年04月24日投稿 / 投稿者 : 名無しさん / タグ : 投稿プログラム 実用ツール 初代対応 QRコード
与えられた文字列からQRコードを作成します。
ただし、バージョン10、誤り訂正レベルL、8ビットバイトモード、マスクパターン011固定です。
LINPUTの仕様で32文字までしか入力できませんが、実際には271文字まで変換可能です。
(プチコンの文字数制限を超えているので、フルに使うのは難しいですが)
なお、作成に当たっては、こちらのサイトを参考にさせていただきました。
プログラムの最初の方の数値を修正することで、モード以外は変更できるようになっています。
詳細はQRコードの仕様(JISX0510、閲覧のみならJISCのページから可能)を参照してください。
変数名 | 行番号 | 内容 |
---|---|---|
VER | 2 | バージョン |
ECL | 2 | 誤り訂正レベル(ビット順を逆にする) |
MASK | 2 | マスクパターン(ビット順を逆にする) |
TOTAL | 3 | 総コード語数 |
RSB | 3 | RSブロック数 |
ECW | 3 | RSブロックごとの誤り訂正コード語数 |
F(I) | 8 | 生成多項式のαの指数 |
VINF | 12 | 型番情報(必要ない場合は0) |
APC | 12 | 位置合わせパターンの中心の行座標数(必要ない場合は1) |
P(I) | 17 | 位置合わせパターンの中心の行座標(必要ない場合は6) |
特に、マスクパターンについては、本来であれば自動的に調整されるべき項目なので、
認識率が悪いようであれば0〜7の間で変えてください。
一応、JISX0510から設定内容を調べる方法を簡単に説明します。
ありません。
プチコンmkII 向けの QR コードです。
- 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 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.098 秒 | このページの最終更新 : 2022/09/20 (火) 12:44:20 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30