Изображение изменяет размер проблемы в PHP - gd, создает ужасные измененные изображения

4 ответа

Используйте imagecopyresampled () вместо imagecopyresized () .

25
ответ дан 6 December 2019 в 06:37
поделиться

Я уже однажды размещал это на SO, но я воспроизведу его здесь, потому что это довольно круто. Он использует хеширование, создавая что-то вроде хеш-набора. Гарантированно O (1) в подмышечном пространстве (рекурсия - это хвостовой вызов) и обычно имеет временную сложность O (N). Алгоритм следующий:

  1. Возьмите первый элемент массива, это будет контрольный.
  2. Измените порядок остальной части массива, насколько это возможно, так, чтобы каждый элемент находился в позиции, соответствующей его хэшу. . По завершении этого шага будут обнаружены дубликаты. Установите их равными дозорному.
  3. Переместите все элементы, для которых индекс равен хешу, в начало массива.
  4. Переместите все элементы, которые равны дозорному, кроме первого элемента массива, в конец массива.
  5. What ' s, оставленные между правильно хешированными элементами и повторяющимися элементами, будут элементами, которые не могут быть помещены в индекс, соответствующий их хешу, из-за конфликта. Рекурсия для работы с этими элементами.

Можно показать, что это O (N), при условии отсутствия патологического сценария в хешировании: даже если нет дубликатов, примерно 2/3 элементов будут удаляться при каждой рекурсии. Каждый уровень рекурсии - O (n), где маленький n - количество оставшихся элементов. Единственная проблема заключается в том, что на практике это медленнее, чем быстрая сортировка, когда есть несколько дубликатов, то есть много коллизий. Однако, когда существует огромное количество дубликатов, это удивительно быстро.

Редактировать: В текущих реализациях D hash_t составляет 32 бита. Все в этом алгоритме предполагает, что будет очень мало, если вообще будет, хеш-коллизии в полном 32-битном пространстве. Однако столкновения могут часто происходить в пространстве модулей. Однако это предположение, по всей вероятности, будет верным для любого набора данных разумного размера. Если ключ меньше или равен 32 битам, это может быть собственный хэш, что означает, что коллизия в полном 32-битном пространстве невозможна. Если он больше, вы просто не можете уместить их достаточное количество в 32-битное адресное пространство памяти, чтобы это было проблемой. Я предполагаю, что hash_t будет увеличен до 64 бит в 64-битных реализациях D, где наборы данных могут быть больше. Более того, если это когда-либо окажется проблемой, можно будет изменить хэш-функцию на каждом уровне рекурсии.

Вот реализация на языке программирования D:

1
ответ дан 6 December 2019 в 06:37
поделиться

Вы также можете ознакомиться с пакетом Image_Transform PEAR . Он заботится о многих низкоуровневых деталях и делает создание и обработку изображений безболезненными. Он также позволяет использовать библиотеки GD или ImageMagick. Я использовал его с большим успехом в нескольких проектах.

0
ответ дан 6 December 2019 в 06:37
поделиться

Вы также можете рассмотреть возможность использования ImageMagick ( http://us3.php.net/manual/en/book.imagick.php ) вместо Gd. У меня была такая же проблема всего пару дней назад с Java. Переход на ImageMagick вместо Java Advanced Images привел к огромной разнице в качестве.

1
ответ дан 6 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: