Для каждого пикселя необходимо преобразовать от цвета до шкалы полутонов - что-то как $grey = $red * 0.299 + $green * 0.587 + $blue * 0.114; (это весовые коэффициенты NTSC; существуют другие подобные коэффициенты. Это подражает переменной скорости отклика глаза к различным цветам).
Тогда необходимо выбрать значение сокращения - обычно половина максимального пиксельного значения, но в зависимости от изображения можно предпочесть более высокое значение (сделайте изображение более темным), или ниже (делают изображение более ярким).
Просто сравнение каждого пикселя к сокращению теряет много детали - т.е. большие темные области идут абсолютно черные - так для сохранения большей информации, можно размыться. В основном запустите наверху оставленный изображения: поскольку каждый пиксель добавляет ошибку (различие между исходным значением и финалом присвоенное значение) для пикселей налево и выше прежде по сравнению со значением сокращения.
знать, что выполнение в этом PHP будет очень медленным - необходимо было бы гораздо дальше вперед найти библиотеку, которая обеспечивает это.
Я рекомендую вам прочитать спецификацию HTTP 1.1 , особенно разделы 3.2 Унифицированные идентификаторы ресурсов и 9.1.1 Безопасные методы ]. Надеюсь, они ответят на ваш вопрос.
Вот дополнительная информация:
Если вы генерируете эти длинные URL-адреса на сервере, вы можете использовать сжатие для информации о пути.
Итак, если у вас есть что-то вроде /? Param1 = bla-bla & param2 = bla-bla, вы просто сжимаете эти параметры и заставляете URL-адрес выглядеть как /? Query = ASsadcnfAFFASFscnsdlc
Когда вы получаете такой запрос, вы просто распаковываете их и анализируете строка параметров
Я бы нацелен на HTTP POST. Он красиво токенизируется, когда попадает в PHP (или что бы вы ни использовали), и у него нет ограничений по размеру, которые есть у других.
Используйте настраиваемые заголовки HTTP с HTTP GET, если ничего не помогает. Заголовки HTTP могут быть установлены почти всеми клиентами.
Обычно лучше использовать параметры URL в строке запроса. Слишком много параметров URL-адреса означает, что вам необходимо разделить службы на более мелкие.
Вы должны поместить параметры в строку запроса, используя запрос HTTP GET. Ограничения в некоторых старых веб-браузерах не вызывают беспокойства, потому что единственные люди, просматривающие API в веб-браузере, скорее всего, будут разработчиками (или, по крайней мере, техническими).
Помните, что клиентские приложения не должны , а не манипулировать URL-адресами, которые предоставляет им ваш API. URL-адреса являются непрозрачными идентификаторами для клиентов, используемыми только для направления их туда, где могут быть найдены определенные ресурсы.
Если это невозможно по какой-либо причине, я бы использовал запрос POST с параметрами, закодированными в теле. Это не будет полностью RESTful, но, если ваши ресурсы спроектированы правильно, влияние на клиентский код должно быть минимальным.
base64 должен это сделать. в противном случае используйте стандартный знак%.
Для этого не существует идеального способа.
Правильный способ HTTP / REST - использовать GET и иметь все параметры в URL-адресе в качестве аргументов запроса. Вы определили две практические проблемы с этим подходом
Надеюсь, вы сможете заставить простой GET работать в своей среде. Вы даже можете подумать о рефакторинге вашего API, чтобы уменьшить размер данных запроса.
Но что, если вы не можете заставить GET работать? Вы предлагаете несколько альтернатив. Я бы сразу двух из них уволил. Не помещайте содержимое в тело запроса GET; слишком много программного обеспечения сломается, если вы попробуете это, и в любом случае это нарушит тот самый дух REST, который вы пытаетесь захватить. И я бы не стал использовать кодировку base64. Это может помочь вам обойти проблему 1, ваш сервер неправильно обрабатывает некоторые символы в URL-адресах. Но при неправильном применении это фактически сделает ваши URL-адреса длиннее, а не короче, что усугубляет проблему 2. Даже если вы сделаете base64 правильно и включите некоторое сжатие, это не сделает URL-адреса значительно короче и значительно усложнит клиент.
Наиболее практичным решением, вероятно, является вариант 3, HTTP POST. Это не RESTful; вы должны использовать GET для запросов только для чтения. И вы потеряете некоторые преимущества подхода REST с кешированием GET и т.п. С другой стороны, он будет работать правильно и просто с большим разнообразием инфраструктуры Интернета и программных библиотек. Затем вы можете передать столько данных, сколько хотите, в теле POST либо с помощью кодировки multipart / form-data, JSON или XML. (Я создал две основные общедоступные веб-службы с использованием SOAP, который представляет собой просто XML в POST. Это уродливо и не является RESTful, но работает надежно.)
REST - отличная парадигма дизайна. Это руководство. Если он не подходит для вашего приложения, не думайте, что вам нужно его придерживаться. HTTP не подходит для передачи больших объемов данных на сервер с помощью GET. Если вам нужны гигантские параметры запроса, сделайте что-нибудь еще.
Я бы определенно начал с того, с чего начали вы: сокращение URL-адресов. Я бы попробовал сократить имена параметров (? A = XXX; b = YYY; c = zzz); Перекодировать весь запрос в Base64; GZip Base64; Хаффман кодирует GZip; ... все, что нужно. Как только я понял, что сокращение не будет работать во всех случаях (у вас есть какая-то динамическая система создания фильтров, которую можно добавлять на неопределенное время или ж / д), тогда вы должны признать, что, возможно, пытаетесь сделать все в рамках одного запроса может не сработать ...
Я НЕ собираюсь предлагать вам бросать несколько GET с параметрами разделения и пытаться таким образом отслеживать запросы ...
Единственный «надежный» Метод, который я МОГУ предложить, - сохранить / установить запрошенную строку запроса в одном запросе (POST) и вернуть ему идентификатор фиксированного размера (или guid), который идентифицирует местоположение параметра запроса в вашем хранилище данных (filterID), а затем выполнить фактический GET запрос с использованием токена filterID вместо значения строки запроса полного фильтра. Это позволит выполнять всевозможные изящные вещи, такие как кэширование ответов на основе filterID, чтобы вы могли (теоретически) повторно использовать те же фильтры позже (вместо того, чтобы повторно вводить их вручную, просто сохраните «метку» вместе с телом фильтра и выберите из последние 5 фильтров по ярлыку) или, по крайней мере, сохранить их вместе с вашими данными, чтобы каждый раз, когда вы обновляете страницу, не отправлялся повторно весь запрос фильтра.
затем выполните фактический запрос GET, используя токен filterID вместо значения строки запроса полного фильтра. Это позволит выполнять всевозможные изящные вещи, такие как кэширование ответов на основе filterID, чтобы вы могли (теоретически) повторно использовать те же фильтры позже (вместо того, чтобы повторно вводить их вручную, просто сохраните «метку» вместе с телом фильтра и выберите из последние 5 фильтров по ярлыку) или, по крайней мере, сохранить их вместе с вашими данными, чтобы каждый раз, когда вы обновляете страницу, не отправлялся повторно весь запрос фильтра. затем выполните фактический запрос GET, используя токен filterID вместо значения строки запроса полного фильтра. Это позволит выполнять всевозможные изящные вещи, такие как кэширование ответов на основе filterID, чтобы вы могли (теоретически) повторно использовать те же фильтры позже (вместо того, чтобы повторно вводить их вручную, просто сохраните «метку» вместе с телом фильтра и выберите из последние 5 фильтров по ярлыку) или, по крайней мере, сохранить их вместе с вашими данными, чтобы каждый раз, когда вы обновляете страницу, не отправлялся повторно весь запрос фильтра.Рой Филдинг , вероятно, одобрил бы использование POST в этой ситуации, но вы должны спросить его.
В общем, большинство приложений, которые вовлекать данные, предоставленные пользователем, поставляемые на сервер небезопасны. Единственное исключение - когда информация представлена в виде обобщенные параметры запроса, для существует компромисс между GET и POST, которые обычно включают размер содержимого параметра . ПОЛУЧИТЬ желательно только в тех случаях где параметры могут быть выражены как значимый URI.