2

QRコードでバイト配列を転送しようとしているので、テストのために、ランダムなバイト配列を生成し、QRコードとしてエンコードしてからデコードすることにしました。ISO-8859-1 を使用してバイト配列を文字列 st に変換し、送信中にデータが失われることはありません。

エンコーダ側の場合:

byte []buffer = new byte[11];
com.google.zxing.Writer writer = new QRCodeWriter();
Random randomGenerator = new Random();
    for(int i=0;i<=10;i++){
        buffer[i]=(byte) randomGenerator.nextInt(254);
    }
   // Log.i("time1","original: "+Arrays.toString(buffer));
    String decoded = null;
    try {
        decoded = new String(buffer, "ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        result=writer.encode(decoded, BarcodeFormat.QR_CODE, 500, 500);
    } catch (WriterException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

このように、バイト配列を QR コードに変換しましたが、問題ありません。しかし、受信側の場合:

LuminanceSource source = new PlanarYUVLuminanceSource(data,640,480,0,0,640,480,false);
bmtobedecoded = new BinaryBitmap(new HybridBinarizer(source));
Map<DecodeHintType,Object> mp=new HashMap<DecodeHintType, Object>();

mp.put(DecodeHintType.TRY_HARDER, true);
try {
    result= qrr.decode(bmtobedecoded,mp);
} catch (NotFoundException e) {
    Log.i("123","not found");
    e.printStackTrace();
} catch (ChecksumException e) {
    Log.i("123","checksum");
    e.printStackTrace();
} catch (FormatException e) {
    Log.i("123","format");
    e.printStackTrace();
}

生成された QR コードをデコードしようとしましたが、NotFoundException がスローされます。誰かがこの問題で私を助けることができますか?

更新 1 : デコーダーが通常の QR で完全に動作することを確認しました。DecodeHintType.try_harder も追加しましたが、それでもうまくいきません。

更新 2 : 明確にするために、以下は、バイト配列と文字列の間で変換するために行ったことです。

Random randomGenerator = new Random();
for(int i=0;i<=10;i++){
    buffer[i]=(byte) randomGenerator.nextInt(254);
}
Log.i("time1","original: "+Arrays.toString(buffer));
String decoded = null;
try {
    decoded = new String(buffer, "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Log.i("time1","encoded string:" + decoded);
BitMatrix result=null;
try {
    result=qw.encode(decoded, BarcodeFormat.QR_CODE, 500, 500);
} catch (WriterException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
iv.setImageBitmap(encodematrix(result));
byte[] encoded = null;
try {
    encoded = decoded.getBytes("ISO-8859-1");
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 
Log.i("time1","result byte array:" + java.util.Arrays.toString(encoded));

これを実行すると、最終的にまったく同じ配列を取得できることが簡単にわかります。私はこれで問題ありません。

更新 3 : UTF-8 を使用してエンコードも試みましたが、データが失われるため、エンコーダーでは使用できません。

更新 4 : 追加:

Map<DecodeHintType,Object> mp=new HashMap<DecodeHintType, Object>();
mp.put(DecodeHintType.CHARACTER_SET, "ISO-8859-1");

デコーダーで、まだ例外をスローしています。

4

2 に答える 2

1

PURE_BARCODEモードを検出のヒントとして試してください。奇妙なことに、画像が純粋な合成画像である場合、ファインダ パターンの誤検知ははるかに大きな問題になります。ヒューリスティックは、これらの問題のない写真を想定しています。この代替モードでは、それが写真ではなく純粋な画像であることを利用して、はるかに高速で検出を誤ることがありません。

于 2013-01-17T03:47:03.737 に答える