SSブログ

[.NET]QRコードの変換 [Programming .NET Tips]

[はじめに]
・最近、仕事でQRコードを扱うシステム開発に携わる機会が多いので、
 .NETでも作ってみました。
 .NET FrameworkではQRコードを標準でサポートしていない為、
 外部のコンポーネントを利用しています。

[関連情報]
QRコードの仕様 (デンソーウェーブのサイト)
 http://www.qrcode.com
外部コンポーネント
 「ThoughtWorks.QRCode.dll」を参照しています。
 [Open Source QRCode Library] からダウンロードできます。
 「ThoughtWorks.QRCode.dll」を参照は、「参照設定」から追加して下さい。
 (※追加しないとコンパイルエラーになります。)
  参照設定

[ソース]
 QRコードの変換ユーティリティクラスです。
 提供するメソッドは、以下の2つです。
 ・Encodeメソッド:文字列をQRコードのイメージに変換する。
 ・Decodeメソッド:QRコードのイメージから文字列を取得する。
Imports System.IO
Imports System.Text
Imports ThoughtWorks.QRCode.Codec
Imports ThoughtWorks.QRCode.Codec.Data
Imports ThoughtWorks.QRCode.Codec.Util

''' <summary>
''' QRコード関連のユーティリティ
''' </summary>
''' <remarks></remarks>
Public NotInheritable Class QRCodeUtil

    '[説明]
    '[参照設定]
    '   ThoughtWorks.QRCode.dll
    '  上記DLLは、以下のサイトよりダウンロード可能
    '  [Open Source QRCode Library]
    '  [http://www.codeproject.com/KB/cs/qrcode.aspx]
    '[QRコードの仕様]
    '   デンソーウェーブの下記サイトをご参照下さい。
    '   [QR Code.com]
    '   [http://www.qrcode.com]


    ''' <summary>
    ''' デフォルトのエンコーディング名
    ''' </summary>
    ''' <remarks></remarks>
    Private Const DEFAULT_ENCODING_NAME As String = "shift_jis"

    ''' <summary>
    ''' デフォルトのエンコーディング
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared ReadOnly DEFAULT_ENCODING As Encoding _
             = Encoding.GetEncoding(DEFAULT_ENCODING_NAME)

#Region "文字列をQRコードに変換する。"

    ''' <summary>
    ''' 文字列をQRコードに変換する。
    ''' </summary>
    ''' <param name="txtData">変換元の文字列</param>
    ''' <param name="encMode">情報の種類(Byte/AlphaNumeric/Numeric)</param>
    ''' <param name="errCorrect">誤り訂正能力(L/M/Q/H)</param>
    ''' <param name="scale">1セル当りのピクセル数</param>
    ''' <param name="version">QRコードに格納する情報量を決める型番(1~40)</param>
    ''' <returns>QRコードのイメージ</returns>
    ''' <remarks></remarks>
    Public Shared Function Encode( _
        ByVal txtData As String, _
        ByVal encMode As QRCodeEncoder.ENCODE_MODE, _
        ByVal errCorrect As QRCodeEncoder.ERROR_CORRECTION, _
        ByVal scale As Integer, _
        ByVal version As Integer _
        ) As Image

        Return Encode( _
            txtData, encMode, errCorrect, _
            scale, version, DEFAULT_ENCODING)
    End Function


    ''' <summary>
    ''' 文字列をQRコードに変換する。
    ''' </summary>
    ''' <param name="txtData">変換元の文字列</param>
    ''' <param name="encMode">情報の種類(Byte/AlphaNumeric/Numeric)</param>
    ''' <param name="errCorrect">誤り訂正能力(L/M/Q/H)</param>
    ''' <param name="scale">1セル当りのピクセル数</param>
    ''' <param name="version">QRコードに格納する情報量を決める型番(1~40)</param>
    ''' <param name="encoding">エンコーディング</param>
    ''' <returns>QRコードのイメージ</returns>
    ''' <remarks></remarks>
    Public Shared Function Encode( _
        ByVal txtData As String, _
        ByVal encMode As QRCodeEncoder.ENCODE_MODE, _
        ByVal errCorrect As QRCodeEncoder.ERROR_CORRECTION, _
        ByVal scale As Integer, _
        ByVal version As Integer, _
        ByVal encoding As System.Text.Encoding _
        ) As Image

        Dim errMsg As String = Nothing

        Dim qrEnc As QRCodeEncoder = Nothing
        Dim img As Image = Nothing

        '引数チェック
        '[変換元の文字列]
        '   Nothingと空文字列はNGとする。
        If String.IsNullOrEmpty(txtData) Then
            Throw New ArgumentException( _
                "Encode#txtDataが、Nothingか空文字列です。")
        End If

        '[QRコードに格納する情報量を決める型番]
        '   1~40の範囲外はNGとする。
        If version < 1 OrElse version > 40 Then
            errMsg = String.Format( _
                "Versionが範囲外[1~40]です。値:[{0}]", version)
            Throw New ArgumentOutOfRangeException( _
                "Encode#version", errMsg)
        End If

        qrEnc = New QRCodeEncoder()

        '「情報の種類」を設定
        '   QRCodeEncoder.ENCODE_MODE.BYTE
        '   QRCodeEncoder.ENCODE_MODE.NUMERIC
        '   QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC
        qrEnc.QRCodeEncodeMode = encMode

        '「誤り訂正能力」を設定
        '   QRCodeEncoder.ERROR_CORRECTION.L
        '   QRCodeEncoder.ERROR_CORRECTION.M
        '   QRCodeEncoder.ERROR_CORRECTION.Q
        '   QRCodeEncoder.ERROR_CORRECTION.H
        qrEnc.QRCodeErrorCorrect = errCorrect

        '「1セル当りのピクセル数」を設定
        '   数値が大きい程、画像のサイズは大きくなる。
        qrEnc.QRCodeScale = scale

        '「QRコードに格納する情報量を決める型番」を設定
        '   1から40までの整数を指定
        '   格納するデータ長が長い程、
        '   より大きいバージョン番号を必要とする。
        '   QRコードを構成するセルの数も多くなる。
        qrEnc.QRCodeVersion = version

        img = qrEnc.Encode(txtData, encoding)

        Return img
    End Function
#End Region

#Region "QRコードのイメージから文字列を復元する。"

    ''' <summary>
    ''' QRコードのイメージから文字列を復元する。
    ''' </summary>
    ''' <param name="imgData">QRコードのイメージ</param>
    ''' <returns>復元後の文字列</returns>
    ''' <remarks></remarks>
    Public Shared Function Decode( _
        ByVal imgData As Image _
        ) As String
        Return Decode(imgData, DEFAULT_ENCODING)
    End Function


    ''' <summary>
    ''' QRコードのイメージから文字列を復元する。
    ''' </summary>
    ''' <param name="imgData">QRコードのイメージ</param>
    ''' <param name="encoding">エンコーディング</param>
    ''' <returns>復元後の文字列</returns>
    ''' <remarks></remarks>
    Public Shared Function Decode( _
        ByVal imgData As Image, _
        ByVal encoding As System.Text.Encoding _
        ) As String

        Dim qrDec As QRCodeDecoder = Nothing
        Dim qrBitmap As QRCodeBitmapImage = Nothing
        Dim txtData As String = Nothing

        '引数チェック
        '[変換元の文字列]
        '   NothingはNGとする。
        If imgData Is Nothing Then
            Throw New ArgumentNullException( _
                "Decode#imgDataがNothingです。")
        End If

        qrDec = New QRCodeDecoder()
        qrBitmap = New QRCodeBitmapImage(New Bitmap(imgData))

        txtData = qrDec.decode(qrBitmap, encoding)

        Return txtData
    End Function

#End Region

End Class
[VB.NET]QRコードの変換ユーティリティ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。