2010-12-01 2 views
0


Я собираюсь уйти с моим прецедентом, прежде чем я объясню проблему, с которой я столкнулся.PHP fix image bytes

Я создаю мобильное приложение, используя рамки phonegap.
Для этого приложения мне нужно загрузить файл (изображение сделанное с помощью камеры).
На большинстве платформ я могу вернуть это изображение в качестве кодированного изображения base64.
Я могу отправить это обратно на сервер, и он может его декодировать и сохранить. (и делать некоторые другие вещи для удовольствия, так как это QR-код).

Теперь на symbian я не могу вернуть строку base64, и я могу получить URI только для изображения. Это не проблема, потому что я могу использовать xmlhttprequest, чтобы получить данные изображения и закодировать его на base64 с помощью javascript.

Этот метод работает, но это дает мне проблему.
У браузера Symbian появляется ошибка. Это веб-браузер на основе браузера с 2005 года (да, это старый, даже на новейших телефонах s60).
Ошибка в том, что он преобразует все символы, которые он не знает (не в таблице utf-8), в 2 байта. Если правильно помнить это было все выше 127.

Я попытался исправить эту ошибку, используя javascript, но это был не гот (btw, canvas, а затем getBinaries или что-то вроде этого не поддерживаются, так как canvas 2d не поддерживается браузером).

Итак, я пытаюсь создать обходной путь в 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 разместить его в любом случае.

Теперь, мой вопрос:
Am i на правильном пути?
Как я могу решить предупреждение?

спасибо заранее,
Эрик

P.S. извините, если мой английский плохой. Я не носитель языка, как я голландский.
p.s.2 Исправлена ​​ошибка я говорил это одна: http://markmail.org/message/iosbn3rbcgu5k6qt

EDIT: Решения для макс 100 глубины было труднее, то я думал, что это будет. Так что помощь в этом тоже будет большой.

+0

Как выглядят оригинальные и модифицированные последовательности байтов? – 2010-12-01 09:23:54

+0

Не знаю, как дать вам правильные байты, но я могу дать вам base64: http://www.erikmaas.com/test/bins.html – Erik 2010-12-01 10:15:55

ответ

0

Решение этой проблемы не было.
Я перешел на сторону javascript приложения, чтобы исправить там байты.

0

Почему вы пытаетесь создать изображение после каждого байт? И для чего это рекурсия? Не можете ли вы просто запустить строку и исправить эти двойные байты? Что-то вроде этого:

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, добавить этот и следующий код символа вместе, и использовать его как один символ» и я предположил, что этот подход действительно то, что вы хотите (мы не можем знать, поскольку мы не знаем ваши данные).