Respostas:
Eu tive o mesmo problema depois de aplicar o patch 1.9.2.2 e 1.9.2.3. SUPEE-9767 adiciona um método de validação estendido em
app / code / core / Mage / Core / Model / File / Validator / Image.php
O meu era:
public function validate($filePath)
{
$fileInfo = getimagesize($filePath);
if (is_array($fileInfo) and isset($fileInfo[2])) {
if ($this->isImageType($fileInfo[2])) {
return null;
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}
E alterado para:
public function validate($filePath)
{
list($imageWidth, $imageHeight, $fileType) = getimagesize($filePath);
if ($fileType) {
if ($this->isImageType($fileType)) {
//replace tmp image with re-sampled copy to exclude images with malicious data
$image = imagecreatefromstring(file_get_contents($filePath));
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagepng($img, $filePath);
break;
default:
return;
}
imagedestroy($img);
imagedestroy($image);
return null;
} else {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid image.'));
}
}
}
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid MIME type.'));
}
O problema parece ser a imagecopyresampled
chamada sem definir primeiro a transparência, pois mescla o plano de fundo preto padrão imagecreatetruecolor
.
O que fiz foi passar imagecopyresampled
para a instrução switch e adicionar as chamadas de transparência anteriormente imagecopysampled
no caso png (você também pode usá-lo para gif).
Então agora meu if / switch fica assim:
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagecolortransparent($img, imagecolorallocatealpha($img, 0, 0, 0, 127));
imagealphablending($img, false);
imagesavealpha($img, true);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagepng($img, $filePath);
break;
default:
return;
}
imagedestroy($img);
imagedestroy($image);
return null;
}
Isso manteve minha transparência png durante o upload de imagens do produto. Não sei se isso ajudará na marca d'água e, obviamente, se você usar essa cópia, copie o arquivo para a pasta local.
app / code / local / Mage / Core / Model / File / Validator / Image.php
Eu tentaria salvar a imagem novamente (talvez com outro programa). E se isso não ajudar, você pode tentar o seguinte:
app / code / local / Varien / Image / Adapter / Gd2.php e copie o conteúdo de /lib/Varien/Image/Adapter/Gd2.php
Mudança:
$this->_fillBackgroundColor($newImage);
Para:
$this->_fillBackgroundColor($newImage, $frameWidth, $frameHeight);
Mudança:
if (!imagefill($imageResourceTo, 0, 0, $color)) {
Para:
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
Fonte: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/
Edit: isso foi corrigido no Magento 1.9.3.4 / SUPEE-9767 V2
app / code / core / Mage / Core / Model / File / Validator / Image.php
Alterado de:
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
switch ($fileType) {
case IMAGETYPE_GIF:
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagepng($img, $filePath);
break;
default:
return;
}
Para:
if ($image !== false) {
$img = imagecreatetruecolor($imageWidth, $imageHeight);
imagealphablending($img, false);
imagecopyresampled($img, $image, 0, 0, 0, 0, $imageWidth, $imageHeight, $imageWidth, $imageHeight);
imagesavealpha($img, true);
switch ($fileType) {
case IMAGETYPE_GIF:
$transparencyIndex = imagecolortransparent($image);
if ($transparencyIndex >= 0) {
imagecolortransparent($img, $transparencyIndex);
for ($y = 0; $y < $imageHeight; ++$y) {
for ($x = 0; $x < $imageWidth; ++$x) {
if (((imagecolorat($img, $x, $y) >> 24) & 0x7F)) {
imagesetpixel($img, $x, $y, $transparencyIndex);
}
}
}
}
if (!imageistruecolor($image)) {
imagetruecolortopalette($img, false, imagecolorstotal($image));
}
imagegif($img, $filePath);
break;
case IMAGETYPE_JPEG:
imagejpeg($img, $filePath, 100);
break;
case IMAGETYPE_PNG:
imagepng($img, $filePath);
break;
default:
break;
}
Eu criei um módulo Magento de acordo com a resposta de Tim Sullivan que corrige esse problema:
Eu criei um arquivo de patch para instalar facilmente na sua pasta raiz do magento.
URL: Baixe aqui
Descobri que o ajuste dos arquivos Image.php e GD2.php, conforme sugerido nas respostas acima, funciona, mas para mim isso significava que as miniaturas JPEG que não eram completamente quadradas repentinamente tinham fundos pretos. Então, no GD2.php eu mudei
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
}
para
if($this->_fileType == IMAGETYPE_JPEG){
if (!imagefill($imageResourceTo, 0, 0, $color)) {
throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
}
} else {
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
}
}
para manter a situação antiga dos JPEGs.