Magento resize() качество изображения: грязно-белый фон
У меня есть клиент, который серьезно недоволен тем, как их эскизы продуктов отображаются в Magento.
Изворотливый вид заметен на двух счетах:
- грязный белый фон с очень светло-серыми горизонтальными линиями
- и во-вторых, очень незначительная потеря цвета (теряется контраст и насыщенность).
Я удалил ВСЕ сжатие, установил ВСЕ качество на 100%, очистил кэш изображений, экспериментировал, ломал и исправлял все это десятки раз, и, похоже, ничего не работает.
Эта версия Magento является вер. 1.4.2.0
Кто-нибудь здесь испытывает те же проблемы, и если да, то вам удалось это исправить?
7 ответов
Проблема связана с функцией php imagecopyresampled в функции resize в lib/Varien/Image/Adapter/Gd2.php, есть некоторые проблемы с округлением, которые создают плавное изменение размера изображения.
Мое решение состоит в том, чтобы просто изменить любые очень светло-серые пиксели изображения на чисто белый после изменения размера изображения. Для этого сначала скопируйте lib / Varien / Image / Adapter / Gd2.php в приложение /code/local/Varien/Image/Adapter/Gd2.php
Затем найдите следующий код внутри функции изменения размера (около строки 312)
// resample source image and copy it into new frame
imagecopyresampled(
$newImage,
$this->_imageHandler,
$dstX, $dstY,
$srcX, $srcY,
$dstWidth, $dstHeight,
$this->_imageSrcWidth, $this->_imageSrcHeight
);
Затем добавьте следующий код:
// Clean noise on white background images
if ($isTrueColor) {
$colorWhite = imagecolorallocate($newImage,255,255,255);
$processHeight = $dstHeight+$dstY;
$processWidth = $dstWidth+$dstX;
//Travel y axis
for($y=$dstY; $y<($processHeight); ++$y){
// Travel x axis
for($x=$dstX; $x<($processWidth); ++$x){
// Change pixel color
$colorat=imagecolorat($newImage, $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($newImage, $x, $y, $colorWhite);
}
}
}
}
Очистите кэш изображений из управления кэш-памятью в Magento, и у вас должны быть более качественные изображения для новых дисплеев. Несколько вещей, на которые следует обратить внимание при реализации этого, при первом создании изображений снова наблюдается небольшое снижение производительности, и изображения с тенями могут иметь более острые края, поскольку очень светлые серые цвета были удалены.
Попробуйте следующий пример
echo Mage::helper('catalog/image')->init($product, 'small_image')->resize(180, 210)->setQuality(50);
Вы можете поместить свой собственный файл Gd2.php в локальный каталог (app/code/local/Varien/Image/Adapter/Gd2.php) и установить качество до 100%.
Качество работает на меня, поэтому я этого не сделал.
Вы также можете поместить туда свертку изображений, чтобы повысить резкость своих изображений, таким образом, вы получите компенсацию размытия при изменении размера с помощью повышения резкости, например, поместите следующее прямо в конец функции "изменение размера":
$sharpenMatrix = array(array(-1,-1,-1),array(-1,24,-1),array(-1,-1,-1));
$divisor = 16;
$offset = 0;
imageconvolution($newImage, $sharpenMatrix, $divisor, $offset);
У меня были проблемы с качеством изображения на одном из проектов. Но проблема была не в серверной части, а в интерфейсной. Изображения имели плохое качество, потому что ширина и высота изображений, указанные в CSS, были не такими, как у файла изображения.
Быстрая grep показывает, что вы можете установить это для объекта product_image
app/code/core/Mage/Catalog/Helper/Image.php:105: * Set image quality, values in percentage from 0 to 100
app/code/core/Mage/Catalog/Helper/Image.php:107: * @param int $quality
app/code/core/Mage/Catalog/Helper/Image.php:110: public function setQuality($quality)
app/code/core/Mage/Catalog/Helper/Image.php:112: $this->_getModel()->setQuality($quality);
app/code/core/Mage/Catalog/Model/Product/Image.php:38: protected $_quality = 90;
app/code/core/Mage/Catalog/Model/Product/Image.php:88: * Set image quality, values in percentage from 0 to 100
app/code/core/Mage/Catalog/Model/Product/Image.php:90: * @param int $quality
app/code/core/Mage/Catalog/Model/Product/Image.php:93: public function setQuality($quality)
app/code/core/Mage/Catalog/Model/Product/Image.php:95: $this->_quality = $quality;
app/code/core/Mage/Catalog/Model/Product/Image.php:100: * Get image quality
app/code/core/Mage/Catalog/Model/Product/Image.php:106: return $this->_quality;
app/code/core/Mage/Catalog/Model/Product/Image.php:331: 'quality' . $this->_quality
app/code/core/Mage/Catalog/Model/Product/Image.php:387: $this->_processor->quality($this->_quality);
У меня была та же проблема с некоторыми из моих изображений, позже я понял, что эти изображения с более низким разрешением искажаются, попробуйте использовать изображение более 1100 X 1100, и оно должно работать очень хорошо!
Загрузите изображения в формате PNG. Они могут быть не такими маленькими, как JPG, но это позволило нам избежать некоторых проблем с качеством изображения, создаваемых функциональностью изменения размера Magento.