2012-02-12 4 views
3

iOS 프로젝트에서 zxing 라이브러리를 사용하고 있습니다. QR 코드를 읽고 작성하기위한 라이브러리입니다. 이 이루어지는 웹상 내 연구 브라우징 화상을 디코딩하는 과정에서 반전 픽셀 - zxing

는 단계 :

  • 소스로부터의 화상을 얻어,
  • 255 계조
  • 디코딩 모든 화소 변환 데이터

이 특정 라이브러리에서 지원하지 않는 한 가지로 역변환 된 QRCode의 읽기/디코딩 (작성시 누락 된 것 같습니다)입니다.

반전 된 QR 코드는 기본적으로 일반 코드와 동일하지만 반전 된 색상 (흰색은 검은 색이고 검은 색은 흰색)입니다. 그러나 QRCodes 표준은 거꾸로 된 QRCodes 구현을 설명하지 않으며 zxing 프로젝트 웹 사이트에는 몇 가지 요청과 문제가 있으므로 직접 구현해야합니다.

아래의 방법은 픽셀 (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++ 코드를 Android 앱에 추가/편집 할 수 있습니까? –