Hatena::ブログ(Diary)

讃容日記 このページをアンテナに追加 RSSフィード

こちらは旧ブログ。新しい記事はチラシのうら(Tumblr)に細々と書いています。

07/04/27(金)

php_qr-0.1.0

php_qr-0.1.0.tgz

PHP4/5 用の QRコード生成拡張モジュールです。

f:id:rsky:20070427221625p:image:h100

インストール方法

通常の PHP 拡張モジュール同様にインストールできます。

tar xfz php_qr-0.1.0.tgz
cd php_qr-0.1.0
phpize
./configure --enable-qr
make
sudo make install

PHP の GD エクステンションを使った GIF, JPEG, PNG, WBMP 出力を有効にするには --enable-qr-gd オプションを使います。

zlib で圧縮した TIFF 出力を有効にするには --with-qr-tiff オプションを使います。

tar xfz php_qr-0.1.0.tgz
cd php_qr-0.1.0
if ! -f /path/to/php-install-dir/include/php/ext/gd/libgd/gd.h; then
  mkdir -p ext/gd/libgd
  cp /path/to/php-src/ext/gd/libgd/gd.h ext/gd/libgd
  cp /path/to/php-src/ext/gd/libgd/gdhelpers.h ext/gd/libgd
fi
/path/to/php-install-dir/bin/phpize
./configure --enable-qr --enable-qr-gd --with-qr-tiff=/path/to/zlib-install-dir --with-php-config=/path/to/php-install-dir/bin/php-config
make
sudo make install

PHP4/5 共通の機能

以下の関数が提供されます。

string qr_get_symbol(string $data[, array $options]);
int qr_output_symbol(mixed $output, string $data[, array $options]);
string qrcode(string $data[, array $options]);

qr_get_symbol() は $data を QRコードシンボルに変換して返します。シンボルの生成に失敗したときは false を返します。

qr_output_symbol() の第一引数 $output には出力先のファイル名もしくは書き込み可能なストリームリソースを指定します。$output が空文字列または null の場合は通常の出力バッファに書き込みます。それ以外の場合はエラーとなります。返り値はストリームに書き込まれたバイト数で、失敗したときは false を返します。

qrcode() は qr_get_symbol() のエイリアスです。


$options で符号化および出力の詳細な設定をします。

  • version (default: -1)
    • 生成する QRコードシンボルの型番 (1-40)。-1 の場合、通常の QRコードでは自動選択、構造的連接の場合は 1 となる。
  • mode (default: QR_EM_AUTO)
    • 符号化モード。以下から選択。
      • QR_EM_AUTO (自動選択)
      • QR_EM_NUMERIC (数字)
      • QR_EM_ALNUM (英数字)
      • QR_EM_8BIT (8ビットバイト)
      • QR_EM_KANJI (漢字)
  • eclevel (default: QR_ECL_M)
    • 誤り訂正レベル。以下から選択。
      • QR_ECL_L (レベルL: 7%)
      • QR_ECL_M (レベルM: 15%)
      • QR_ECL_Q (レベルQ: 25%)
      • QR_ECL_H (レベルH: 30%)
  • masktype (default: -1)
    • マスクパターン種別 (1-7)。-1 なら自動選択。
  • format (default: QR_FMT_DIGIT)
    • 出力形式。以下から選択。
      • QR_FMT_DIGIT (0,1 とスペースで構成される文字列)
      • QR_FMT_ASCII (アスキーアート)
      • QR_FMT_JSON (JSON)
      • QR_FMT_PBM (Portable Bitmap)
      • QR_FMT_BMP (Windows Bitmap)
      • QR_FMT_SVG (SVG 1.1)
      • QR_FMT_TIFF (TIFF, ビッグエンディアン, deflate 圧縮)
      • QR_FMT_GIF (GIF)
      • QR_FMT_JPEG (JPEG)
      • QR_FMT_PNG (PNG)
      • QR_FMT_WBMP (Wireless Bitmap)
    • TIFF, GIF, JPEG, PNG, WBMP のサポートを有効にするには configure で指定が必要。
    • ソフトウェアによっては deflate 圧縮された TIFF の読み込みをサポートしていないものもある。
  • magnify (default: 1)
    • 1 モジュールあたりの大きさ (1-16)。
  • separator (default: 4)
    • 分離パターン幅 (0-16)。既定値の 4 は QRコード規格上の下限。
  • maxnum (default: 1)
    • シンボル数。1 なら通常の QRコード、2 から 16 の場合は構造的連接 (連結コード) を生成する。それ以外はエラー。
  • order (default: 0)
    • 構造的連接の場合のシンボルの並べ方。0 ならなるべく正方形に近くなるように、正の数なら横に order 個ずつ、負の数なら縦に |order| 個ずつ並べる。多次元配列として出力する JSON では無視される。

PHP5 専用の機能

オブジェクト指向API もあり、こちらでは符号化モードを混在した QRコードを作成したりできます。

説明はまた後日。


使用例

function qr_output_symbol()

<?php
!extension_loaded('qr') && (dl('qr.so') || exit(1));

$data = 'QRコードは、株式会社デンソーウェーブの登録商標です。';
$data = mb_convert_encoding($data, 'SJIS-win', 'UTF-8');
$options = array(
    'mode' => QR_EM_KANJI,
    'format' => QR_FMT_BMP,
    'magnify' => 2,
);
qr_output_symbol('qr.bmp', $data, $options);

class QRCode

<?php
!extension_loaded('qr') && (dl('qr.so') || exit(1));

$data = 'QRコードは、株式会社デンソーウェーブの登録商標です。';
$data = mb_convert_encoding($data, 'SJIS-win', 'UTF-8');

$qr = new QRCode(array('version' => 1, 'maxnum' => 16));

$qr->addData($data, QR_EM_KANJI);

$qr->finalize();

$qr->setFormat(QR_FMT_TIFF);
$qr->setMagnify(2);
$qr->setOrder(-1);
$qr->outputSymbol('qr.tiff');

$qr->setFormat(QR_FMT_BMP);
foreach ($qr as $pos => $symbol) {
    file_put_contents(sprintf('qr%d.bmp', $pos + 1), $symbol);
}

tanakatanaka 2011/05/02 19:10 関山 様

素晴らしいプログラムを公開していただき大変感謝しております。
私はECCUBEでQRコードを表示させたく「php_qr-0.3.1.tgz」をインストールしようとしているのですが、PHP 5.3には対応していないよいうで、インストール途中(./configure --enable-qr のところから)でエラーとなります。

あつかましい質問で恐縮ですが、PHP5.3.6以上でインストールする方法は無いでしょうか。

田中

tanakatanaka 2011/05/03 01:51 あ、ごめんなさい。
PHP5.3でも対応するように「qr-0.4.0」がありましたね。
大変、失礼しました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証