Артефакты при ресайзе библиотекой GD изображений с однородным (белым) фоном

Подробнее читаем сюда - http://mithrandir.ru/professional/php/gd-resizing-artefacts-fix.html
Пипеткой можно пощупать пиксели, и увидеть, что большинство из них имеет самые близкие к белому цвета: #fefefe (rgb 254, 254, 254) и #fdfdfd (rgb 253, 253, 253). Задача теперь ясна - нужно заменить пиксели этих цветов на белые.
Общий случай
Находим скрипт, который отвечает за создание эскизов и находим в нём место, где происходит изменение размера изображения. Можно запустить поиск по всем файлам вашего проекта по запросу imagecopyresampled:
// Что-то подобное присутствует в любом ресайзере на gd $oldImg = imagecreatefromjpeg($oldImgPath); $newImg = imagecreatetruecolor($width, $height); imagecopyresampled($newImg, $oldImg, 0, 0, 0, 0, $newWidth, $newHeight, $oldWidth, $oldHeight); /* * А вот и он - финт ушами для очистки белого фона от шумов и артефактов * Действует в лоб - пробегает картинку и заменяет на ней почти белые цвета на белый * Добавляется в код ресайзинга после imagecopyresampled */ // Это - цвет на который будем заменять (белый) $colorWhite = imagecolorallocate($newImg, 255, 255, 255); // Пробегаем все пиксели на изображении по вертикали и горизонтали for($y=0; $y<($newHeight); ++$y) { for($x=0; $x<($newWidth); ++$x) { $colorat=imagecolorat($newImg, $x, $y); $r = ($colorat >> 16) & 0xFF; $g = ($colorat >> 8) & 0xFF; $b = $colorat & 0xFF; // Если цвет пикселя нас не устраивает, заменяем его на белый if(($r == 253 && $g == 253 && $b == 253) || ($r == 254 && $g == 254 && $b ==254)) { imagesetpixel($newImg, $x, $y, $colorWhite); } } } /* * Вот и всё! Как видите, такую штуку можно использовать для любого цвета, не только белого :) */ // Сохранение изображения, оно и так у вас было ;) imagejpeg($newImg, $newImgPath, 100);
Для Opencart 2
В файле /system/library/image.php
Найти:
public function watermark($watermark, $position = 'bottomright') {
Добавить перед:
public function clearNoise($newImg, $newWidth, $newHeight) { $colorWhite = imagecolorallocate($newImg, 255, 255, 255); for($y=0; $y<($newHeight); ++$y) { for($x=0; $x<($newWidth); ++$x) { $colorat=imagecolorat($newImg, $x, $y); $r = ($colorat >> 16) & 0xFF; $g = ($colorat >> 8) & 0xFF; $b = $colorat & 0xFF; if(($r == 253 && $g == 253 && $b == 253) || ($r == 254 && $g == 254 && $b ==254)) { imagesetpixel($newImg, $x, $y, $colorWhite); } } } }
Найти:
imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->width, $this->height);
Добавить после:
self::clearNoise($this->image, $width, $height);
Найти:
imagecopy($this->image, $image_old, 0, 0, $top_x, $top_y, $this->width, $this->height);
Добавить после:
self::clearNoise($this->image, $bottom_x - $top_x, $bottom_y - $top_y);
Затем почистить кэш модификаторов и очистить кэш изображений, а также почистить кэш в браузере.
Если на картинке присутствовали полутени, переходные цвета, они могут пострадать, ведь заменяются не только фоновые пиксели, а вообще все пиксели определённых цветов. Но результат получается всё равно неплохой.

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 0 Composer – пакетный менеджер PHP. Что и как? (13.01.2022)
- 0 MySQL и PHP: Вычисление возраста (количество лет) по дате рождения (20.06.2017)
- 0 Как изменить часовой пояс на сервере (16.11.2013)
- 0 PHP: Как удалить файлы по маске? (07.11.2013)
- 0 Регулярные выражения в PHP (12.04.2014)
- 0 Защита от спама в phpBB3 без капчи (09.10.2013)
- 0 Php функция implode внутри запроса SELECT к MySQL. (02.09.2013)
- 0 Как убрать папку www из денвера? (22.03.2013)
- 0 Устанавливаем и настраиваем WampServer (аналог MAMP в Mac и возможная замена Denwer'у) на Windows (22.03.2013)
- 0 Полезные возможности PhpStorm и настройка горячих клавиш (14.03.2013)
- Оборачиваем изображения в ссылки с помощью хука add_filter('the_content', ...) в functions.php (14.08.2019)
- Добавляем форму отправки обратного звонка на сайт (по Javascript и с ReCaptcha) (29.07.2019)
- Преимущества ИТ–аутсорсинга (25.03.2019)
- Отладка PHP кода в консоли браузера (22.03.2019)
- Как добавить на 1С Битрикс ссылку canonical? (15.03.2019)
- Ошибка в phpmyadmin: count(): Parameter must be an array or an object that implements Countable (27.03.2019)
- Битрикс шпаргалка (16.04.2019)
- Добавляем дополнительные поля в разделе. Пользовательские свойства (01.03.2019)
- Битрикс: проверка залогинен ли пользователь как Админ. (01.03.2019)
- Тонкая настройка SEO для результатов фильтрации каталога битрикс. Создание посадочных страниц для таких фильтраций (25.02.2019)
- Две или более reCaptcha на одной странице. Несколько рекапч на странице (25.02.2019)
- Оверлей кнопка на видео HTML5 video overlay play button (15.02.2019)
- Как поменять пароль от админки Bitrix? Вход в админку без пароля (07.02.2019)
- Битрикс: Формирование цены - отделить пробелом тысячи от сотен (04.02.2018)
- Настраиваем красивое меню типа гамбургер на мобильных, используя плагин mmenu. На примере 1С-Битрикс (04.02.2018)
