RSS-подписка

RSS-лента

Новые статьи

Последние комментарии


Получать обновления на эл. почту

Ваш e-mail:

Рассылка новостей от Loco

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

Нет картинки Библиотека 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)     Подпишитесь на RSS комментариев к этой статье.