На одном из нашх проектов при изменеии размера изображения на блом фоне появляются шумы в виде горизонтальных серых, еле заметных полосок. Я провёл "испытание", вывел 3 ресайза одного и того же изображения http://joxi.ru/brRDRWKsWzNn21 чтобы было лучше видно полоски я обработал изобаржение в paintNet инструментом "Кривые" http://joxi.ru/a2XVkRnSe5LMrg . Первое изображение получено с помощью функции "обёртки" метода CFile::ResizeImageGet(), ничего такого, просто небольшая обёрточка для удобства. Второе изображение получено уже без обёртки, просто CFile::ResizeImageGet() , третье изображение получено в обход битрикса, непосредственно функциями php.
Первые два варианта показывают на конечном изображении шумы, третий - нет. Я проверил ресайз голым php т.к. подозревал что что-то не так с библиотекой GD которую как я понимаю использует и метод битрикса CFile::ResizeImageGet(), но как оказалось голый php не производит шумов.
Вопрос: как заставить CFile::ResizeImageGet() работать нормально?
На основе информации из данного обращения была создана заявка в отдел разработок. Очередность реализации будет обсуждаться в отделе разработок. Сегодня нет возможности говорить о каких-то сроках решения, даже ориентировочных. "CFile::ResizeImageGet добавляет серую рябь на белые изображения" Категория: Пожелания.
Разработка интернет магазина под ключ на 1С-Битрикс www.electroid.org, интеграция битрикс и 1С.
Александр Карпов, можете повторно написать в саппорт, кинув ссылку на это обсуждение. Может моя заявка потерялась. Хотя мне тут недавно пришло уведомление о том что по моему обращение что-то они там починили. Обращение было больше года назад. ))
Если кому-то интересно, то в принципе проблему может быть даже устранили уже, но я еще не проверял на сайтах, где она наблюдалась. https://prnt.sc/joiqvr
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
"main",
"OnAfterResizeImage",
array(
"Handlers",
"checkBadPictures"
)
);
class Handlers{
public static function checkBadPictures(
$file,
$options,
&$callbackData,
&$cacheImageFile,
&$cacheImageFileTmp,
&$arImageSize
) {
if (file_exists($cacheImageFileTmp)) {
if (stripos($cacheImageFileTmp, 'jpg') !== false || stripos($cacheImageFileTmp, 'jpeg') !== false) {
$maxColor = 251;
$oldImg = imagecreatefromjpeg($cacheImageFileTmp);
$sizes = getimagesize($cacheImageFileTmp);
$newImg = imagecreatetruecolor($sizes[0], $sizes[1]);
imagecopyresampled($newImg, $oldImg, 0, 0, 0, 0, $sizes[0], $sizes[1], $sizes[0], $sizes[1]);
$colorWhite = imagecolorallocate($newImg, 255, 255, 255);
for ($y = 0; $y < ($sizes[1]); ++$y) {
for ($x = 0; $x < ($sizes[0]); ++$x) {
$colorat = imagecolorat($newImg, $x, $y);
$r = ($colorat >> 16) & 0xFF;
$g = ($colorat >> 8) & 0xFF;
$b = $colorat & 0xFF;
// Если цвет пикселя нас не устраивает, заменяем его на белый
if (($r >= $maxColor && $g >= $maxColor && $b >= $maxColor)) {
imagesetpixel($newImg, $x, $y, $colorWhite);
}
}
}
imagejpeg($newImg, $cacheImageFileTmp, 100);
}
}
}
}
Код работает только после реального ресайза картинки. Т.е. если вы его будете использовать, то ресайзы картинок нужно пересоздать (например, вручную удалить "плохие" картинки из папки /upload/resize_cache/...).
Параметр $maxColor можете менять так, вам требуется. По сути это минимальный код серого цвета, который будет заменён на белый.
Такая же штука только, у меня это произошло после того как я загрузил изображение в медиабиблиотеку. Вся проблема была все в том же ресайзе, а если быть точнее в ограничениях на изображения медиабиблиотеки, я загрузил изображение больше чем дозволял параметр «Максимальный размер загружаемых в медиабиблиотеку изображений». Загрузил изображение 2400х1200, а ограничение стояло 1024х1024, происходил ресайз и с ним появлялись шумы.