2017-05-24 6 views
1

이 델파이 유닛을 사용하고 있습니다. 나는이 오래된 델파이 구현을 사용하도록 강요하고, 그래서 그것에 대해 물어 보지 않습니다 : 그것은 생산 https://github.com/foxitsoftware/DelphiZXingQRCodeQR DelphiZXingQRCode로 인코딩 된 코드가 ErrorCorrectionLevel> Low로 디코딩되지 않습니다.

QRcodes는 한 내가 "저"에서 오류 수정 수준을 유지로, 잘 어떤 디코더에 의해 디코딩된다. 오류 수정 수준을 높이면 생성 된 코드는 지금까지 시도한 모든 디코더로 디코딩 할 수 없습니다. 그러나 나는 (표준에 의해) 중간 수준의 오류 교정 수준을 사용하도록 강요 받았으며, 더 이상 심각하지는 않다.

그러나 오류 수정 수준을 높이는 방법은 분명하지 않습니다 (지금부터는 ecl). 나는 그것이 3491 행의 DelphiZXingQRCode 파일에 하드 코드 된 것으로 가정한다. Level.FBits : = 1. ecls를 나타내는 hexnumbers에 대한 정보를 찾았지만 지금은 찾을 수 없다. 하지만 그 육각형을 비트로 시험해 보았고 그에 따라 QR 코드의 ecl 비트가 변경되었습니다. 그래서 나는 정확한 수 (1 = 낮음, 0 = 중간, 2 = 높음, 3 = 4 분위수)로 가정했다.

다음은 Level.FBits : = 2 인 QRcode의 예입니다. ecl을 "높음"으로 설정하고 싶습니다. 내용은 "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

변경 사항은 사용자가 직접 추측해야합니다. 어쨌든 수정 해 주셔서 감사합니다. 업스트림을 보낼 수 있습니까? –