2012-02-12 18 views
3

私はiOSプロジェクトでzxingライブラリを使用しています。 QRコードを読んで作成するためのライブラリです。反転ピクセル - zxing

画像の復号処理は、このステップ作られたウェブの周りに私の研究・ブラウジングから:

  • は255のグレースケール
  • デコードにすべてのピクセルを変換し
  • 、ソースからの画像を撮影しますこの特定のライブラリでサポートされていないデータ

ことの一つは、反転QRCodesの/デコードを(と私は、これはまた、作成に欠落していることをかなり確信して)読んでいます。

反転QRコードは基本的に通常のコードと同じですが、反転色(白は黒、黒は白)です。しかし、QRコードの標準では、逆向きのQRコードの実装やzxingのプロジェクトのWebサイトについては記述されていないため、いくつかのリクエストや問題がありますので、これを自分で実装する必要があります。

以下の方法は、ピクセル(unsigned char*)を反転するロジックを挿入するのに適していますが、C++での経験がないため、この書き込みが行われます。

grayData_は、unsigned char*データ型です。この変数の中には、ソースからのgrayScaledピクセルがあります。

私がしたいことは、これらのピクセルを反転させることです。

私が正しい場合、これはunsigned char cz = (255 - val);によって行われますか?

unsigned char* GreyscaleLuminanceSource::getMatrix() { 
    int size = width_ * height_; 
    unsigned char* result = new unsigned char[size]; 
    if (left_ == 0 && top_ == 0 && dataWidth_ == width_ && dataHeight_ == height_) { 
     memcpy(result, greyData_, size); 
    } else { 
     for (int row = 0; row < height_; row++) { 
      memcpy(result + row * width_, greyData_ + (top_ + row) * dataWidth_ + left_, width_); 
     } 
    } 

    //return result; 
    //from this point down is my implementation 

    printf(" %c", result[200]); 
    printf(" %c", result[600]); 
    printf(" %c", result[6000]); 
    printf(" %c", result[7000]); 

    for (int i = 0; i < size; i++) 
    { 
     int val = static_cast<int>(result[i]); 
     unsigned char cz = (255 - val); 
     result[i] = cz; 
    } 
    printf("******\n"); 
    printf(" %c", result[200]); //prints a " " char to console/terminal 
    printf(" %c", result[600]); //prints a " " char to console/terminal 
    printf(" %c", result[6000]); //prints a " " char to console/terminal 
    printf(" %c", result[7000]); //prints a " " char to console/terminal 

    return result; 
} 

これは、ピクセルを反転する正しい方法ですか?そして、私はresult変数のデータを変更することに満足していません。

+0

C++コードをAndroidアプリケーションに追加/編集するにはどうすればよいですか? –

+0

Francis、iOSのZXingを使った逆バーコードをサポートするための変更を、他の人が使用できるかもしれないオープンソースのレポに入れましたか?私たちは同じ機能が必要です。ありがとう! – Uniphonic

答えて

2

値がASCIIでないため、値を文字として印刷したくないです。 unsignedsとしてそれらを印刷:

printf(" %u", ...); 

あなたは他の変換は、通常の整数推進しているだけで

result[i] = static_cast<unsigned char>(255 - result[i]); 

にループを簡素化することができます。

ZXingはコードを識別する際にいくつかの非対称ヒューリスティックを使用することに注意してください。コードを囲むガード領域がない場合(この場合はガード領域が白であるため)、コードを識別できないことがあります。

+0

ありがとうございました!私はまた、そのメソッドにいくつかのロジックを追加しました。逆のコードを3回目にスキャンします。if((tmp%3 == 0)){...} ' –

+0

ありがとうございました。この回答は人生の節約になります:) –

+0

@smparkesどのように追加/ C + +コードをアンドロイドのアプリケーションで編集できますか? –