2010-12-01 4 views
0


내가 사용하고있는 문제를 설명하기 전에 유스 케이스에 맞춰서 작업 할 것입니다.PHP 수정 이미지 바이트 바이트

나는 phonegap 프레임 워크를 사용하여 모바일 응용 프로그램을 작성하고 있습니다.
이 응용 프로그램의 경우 파일 (카메라로 만든 그림)을 업로드해야합니다.
대부분의 플랫폼에서이 이미지를 base64 인코딩 이미지로 되돌릴 수 있습니다.
이것을 서버로 다시 보낼 수 있으며 디코딩하여 저장할 수 있습니다. (QR 코드이기 때문에 재미있는 일을 할 수 있습니다).

이제 symbian에서 base64 문자열을 가져올 수 없으며 URI 만 이미지에 가져올 수 있습니다. 이것은 xmlhttprequest를 사용하여 이미지 데이터를 얻고 javascript를 사용하여 base64로 인코딩 할 수 있기 때문에 문제가되지 않습니다.

이 방법은 효과가 있지만 문제가됩니다.
심비안 브라우저에 버그가있는 것 같습니다. 2005 년부터 웹킷 기반의 브라우저입니다 (예, 최신 S60 전화기에서도 그렇습니다).
버그는 utf-8 테이블이 아닌 모든 문자를 2 바이트로 변환한다는 점에서 버그입니다. 제대로 기억한다면 127 이상 모든 것이 었습니다.

자바 스크립트를 사용하여이 버그를 수정하려고했지만 캔버스가 지원되지 않으므로 아무 것도 지원되지 않습니다 (btw, canvas 및 getBinaries 또는 이와 유사한 것). 브라우저에서).

그래서, PHP에서 바이트를 수정하는 해결 방법을 빌드하려고합니다.

function getValidBin($bin, $offset = 0) { 
    $binLength = sizeof($bin); 
    for ($i = $offset; $i<=$binLength; $i++) { 
     if ($i == $binLength) { 
      return false; 
     } 
     if ($bin[$i] < 127) { 

      $binT = $bin[$i] + $bin[$i+1]; 
      $bin2 = $bin; 
      $bin2[$i] = $binT; 
      $bin2[$i+1] = null; 
      if (imagecreatefromstring($bin2) != false) { 
       return $bin2; 
      } else { 
       $bin3 = getValidBin($bin2, $i); 

       if ($bin3 != false) { 
        return $bin3; 
       } 
      } 
     } 
    } 
} 

이 기능은 어떤 이유로 작동하지 않습니다 : 이것은 작동하지 않습니다하지만 내가 지금 가지고있는 것입니다. 나는 다음과 같은 경고 얻을 :

Warning: imagecreatefromstring() [function.imagecreatefromstring]: Data is not in a recognized format in /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php on line 98

을 그리고 난 얻을 :

Fatal error: Maximum function nesting level of '100' reached, aborting! in /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php on line 87

이 마지막 하나는 아주 쉽게 해결하기 위해, 내가 생각,하지만 난 i'de 어쨌든 그것을 게시 생각합니다.

내 질문은 다음과 같습니다.
올바른 길에 있습니까?
경고를 어떻게 해결합니까? 사전에 많은
에릭

추신

감사합니다 미안해, 내 영어가 나쁘다면. 나는 네덜란드 인이기 때문에 원어민이 아닙니다.
p.s.2 내가 얘기 한 버그는이 하나입니다 http://markmail.org/message/iosbn3rbcgu5k6qt

편집 : (100) 깊이의 최대에 대한 솔루션은 내가 생각했던 그때 더 열심히했다. 그래서 그것에 도움이 될 것입니다.

+0

원본 및 수정 된 바이트 시퀀스는 어떻게 생겼습니까? –

+0

올바른 바이트를 제공하는 방법을 모르겠지만 base64를 제공 할 수 있습니다. http://www.erikmaas.com/test/bins.html – Erik

+0

Webkit 2005? 아마도 버그가있을 수 있습니다. 웹킷 브라우저를 업그레이드 해보십시오. – alexy13

답변

0

이 문제에 대한 해결책은 없습니다.
응용 프로그램의 자바 스크립트쪽으로 전환하여 바이트를 수정했습니다.

0

왜 각 바이트마다 이미지를 만들려고합니까? 그리고 그 재귀는 무엇입니까? 그냥 문자열을 실행해서 그 2 바이트를 고칠 수 없습니까? 다음과 같은 것 :

function getValidBin($s) { 
    $new_s = ''; 
    for ($i = 0; $i < strlen($bin) ; $i++) 
    { 
     $char = $s{$i}; 
     if (ord($char) > 127) 
     { 
      $char = chr(ord($char) + ord($s{$i})); 
      $i++; 
     } 
     $new_s .= $char; 
    } 
} 

이미 base64 디코딩 된 문자열을 넣어야합니다.

나는 당신의 라인

$binT = $bin[$i] + $bin[$i+1]; 

는 "문자 코드> 127이 있다면, 함께 이것과 다음 문자 코드를 추가하고 단일 문자로 사용"뜻 된 것으로 가정하고 나는 가정 이 접근법은 실제로 당신이 원하는 것입니다 (귀하가 귀하의 데이터를 모르는 것처럼 우리는 알 수 없습니다).

+0

네, 그게 내가 무엇을 찾고 있었는지,하지만 그 바이트가 1 바이트가 될 필요가 있는지 모르겠습니다. 많은 수표가있는 재귀 함수였습니다. 하지만 외관상으로 잘못된 버전은 올바른 버전보다 짧습니다 (모르는 이상한 이유로). 그래서 저는 이제 us-ascii를 사용하는 방법을 살펴 보았습니다. 나에게 약간의 문제가 있지만, 나는 그들이 쉽게 고칠 수 있다고 생각한다. – Erik

관련 문제