PHP исправляет байты изображения - PullRequest
0 голосов
/ 01 декабря 2010


Я собираюсь разобраться с моим вариантом использования, прежде чем объясню проблему, с которой я работаю.

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

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

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

Я пытался исправить эту ошибку, используя javascript, но это не помогло (кстати, 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;
                }
            }
        }
    }
}

Эта функция по какой-то причине не работает.Я получаю следующие предупреждения:

Предупреждение: imagecreatefromstring () [function.imagecreatefromstring]: данные не находятся в распознанном формате в / opt / content / erik / omnicol / HTML / WS / services / qrDecoder/QrDecoder.php в строке 98

И я получаю:

Неустранимая ошибка: достигнут максимальный уровень вложенности функции '100', прерывание!в /opt/content/erik/omnicol/HTML/WS/services/qrDecoder/QrDecoder.php в строке 87

Этот последний вопрос довольно легко решить, я думаю, но я думаю, чтоВ любом случае, отправьте сообщение.

Теперь мой вопрос:
Я на правильном пути?
Как мне решить предупреждение?

Спасибо большое зазаранее,
Эрик

ps извините, если мой английский плох.Я не являюсь носителем языка, так как я голландец.
ps2 Ошибка, о которой я говорил, заключается в следующем: http://markmail.org/message/iosbn3rbcgu5k6qt

РЕДАКТИРОВАТЬ: Решение для максимальной глубины 100 было сложнее, чемЯ думал, что это будет.Так что помощь в этом тоже была бы отличной.

Ответы [ 2 ]

0 голосов
/ 01 марта 2011

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

0 голосов
/ 01 декабря 2010

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

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

...