2017-05-24 49 views
1

私はこのデルファイユニットを使用しています。私はこの古いDelphiの実装を使用するように強制していますので、そのことについて質問しない:それは生産 https://github.com/foxitsoftware/DelphiZXingQRCodeDelphiZXingQRCodeでエンコードされたQRコードは、ErrorCorrectionLevel> Lowでデコードできません。

QRcodesは限り私が「Low」でエラー訂正レベルを保つよう、うまく任意のデコーダによってデコードされています。エラー訂正レベルを上げると、これまでに試したデコーダでは生成されたコードをデコードできません。しかし、私は(標準で)ミディアムの誤り訂正レベルを使用することを余儀なくされました。

ただし、エラー修正レベルを上げる方法は明らかではありません(これからはecl)。私はそれが3491行のDelphiZXingQRCodeファイルにハードコードされていると仮定しています:Level.FBits:= 1. eclsを表すhexnumbersに関する情報が見つかりましたが、今見つけられません。しかし、私はこれらの六角形をビットとして試して、QRコードのeclビットをそれに応じて変更しました。だから、私は六角形が正しいと仮定した(1 =低、0 =中、2 =高、3 =四分位)。

ここにLevel.FBits:= 2というQRcodeの例を示します。これは、eclを "High"にしたいという意味です。内容は "Hello world"ではありません。真ん中の十字のイメージは、私が実装しなければならない標準的な[sic]の一部ですので、それについて尋ねないでください。 enter image description here

これを修正する方法はありますか?私は試みました...まあ...私はコードを理解しようとしましたが、あまりにも多くのことです。私はただそれを修正することはできません。私が他の誰かによって修正されることができない場合、私は別の解決策を見つけなければならないでしょう。どちらが問題になるでしょうか。

答えて

2

解決済み。以下のコードを参照してください。メソッドGenerateQRCode()に、ErrorCorrectionLevelのパラメータが必要になりました。整数0-3。仕事をしているようだ。私はファイルがStackOverflowのために大きすぎるので、いくつかの変更されていない行を削除する必要がありました。あなた自身をマージしてください。

unit DelphiZXingQRCode; 

    // ZXing QRCode port to Delphi, by Debenu Pty Ltd 
    // www.debenu.com 

    // Original copyright notice 
    (* 
    * Copyright 2008 ZXing authors 
    * 
    * Licensed under the Apache License, Version 2.0 (the "License"); 
    * you may not use this file except in compliance with the License. 
    * You may obtain a copy of the License at 
    * 
    *  http://www.apache.org/licenses/LICENSE-2.0 
    * 
    * Unless required by applicable law or agreed to in writing, software 
    * distributed under the License is distributed on an "AS IS" BASIS, 
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
    * See the License for the specific language governing permissions and 
    * limitations under the License. 
    *) 

    interface 

    type 
     TQRCodeEncoding = (qrAuto, qrNumeric, qrAlphanumeric, qrISO88591, qrUTF8NoBOM, qrUTF8BOM); 
     T2DBooleanArray = array of array of Boolean; 

     TDelphiZXingQRCode = class 
     protected 
     FData: WideString; 
     FRows: Integer; 
     FColumns: Integer; 
     FEncoding: TQRCodeEncoding; 
     FQuietZone: Integer; 
     FElements: T2DBooleanArray; 
     FErrorCorrectionLevel: integer; 
     procedure SetEncoding(NewEncoding: TQRCodeEncoding); 
     procedure SetData(const NewData: WideString); 
     procedure SetQuietZone(NewQuietZone: Integer); 
     procedure SetErrorCorrectionLevel(value: integer); 
     function GetIsBlack(Row, Column: Integer): Boolean; 
     procedure Update; 
     public 
     constructor Create; 
     property Data: WideString read FData write SetData; 
     property Encoding: TQRCodeEncoding read FEncoding write SetEncoding; 
     property ErrorCorrectionLevel: integer read fErrorCorrectionLevel write SetErrorCorrectionLevel; 
     property QuietZone: Integer read FQuietZone write SetQuietZone; 
     property Rows: Integer read FRows; 
     property Columns: Integer read FColumns; 
     property IsBlack[Row, Column: Integer]: Boolean read GetIsBlack; 
     end; 

    implementation 

    uses 
     SysUtils, 
     contnrs, Math, Classes; 

    type 
     TByteArray = array of Byte; 
     T2DByteArray = array of array of Byte; 
     TIntegerArray = array of Integer; 

    // File too large for Stackoverflow: Deleted unchanged lines. 

    { TErrorCorrectionLevel } 

    procedure TErrorCorrectionLevel.Assign(Source: TErrorCorrectionLevel); 
    begin 
     Self.fOrdinal := Source.FOrdinal; 
    end; 

    constructor TErrorCorrectionLevel.Create(ordinalValue: integer); 
    begin 

     fOrdinal:=0; 
     if (ordinalValue >= 0) and (ordinalValue <=3) then 
     fOrdinal:=ordinalValue; 
    end; 

    function TErrorCorrectionLevel.GetBits: integer; 
    begin 
     if fOrdinal = 0 then // level L 
     result:=1 
     else 
     if fOrdinal = 1 then // level M 
     result:=0 
     else 
     if fOrdinal = 2 then // level Q 
     result:=3 
     else 
     if fOrdinal = 3 then // level H 
     result:=2 
     else 
     result:=1; 
    end; 


    // File too large for Stackoverflow: Deleted unchanged lines. 

    procedure TDelphiZXingQRCode.SetErrorCorrectionLevel(value: integer); 
    begin 
     if (value < 0) or (value > 3) then 
     raise Exception.Create('invalid error correction value. must be in range 0..3.'); 

     if value <> fErrorCorrectionLevel then 
     begin 
     FErrorCorrectionLevel:=value; 
     Update; 
     end; 
    end; 

    procedure TDelphiZXingQRCode.SetQuietZone(NewQuietZone: Integer); 
    begin 
     if ((FQuietZone <> NewQuietZone) and (NewQuietZone >= 0) and (NewQuietZone <= 100)) then 
     begin 
     FQuietZone := NewQuietZone; 
     Update; 
     end; 
    end; 

    procedure TDelphiZXingQRCode.Update; 
    begin 
     FElements := GenerateQRCode(FData, Ord(FEncoding), FErrorCorrectionLevel); 
     FRows := Length(FElements) + FQuietZone * 2; 
     FColumns := FRows; 
    end; 
    end. 
+1

これは機能しますが、変更内容の一部を自分で推測する必要があります。とにかく、修正のおかげで、上流に送ることができますか? –

関連する問題