Risposte:
Ho avuto lo stesso problema dopo aver patchato 1.9.2.2 e 1.9.2.3. SUPEE-9767 aggiunge un metodo di convalida esteso in
app / code / core / Mage / core / Modello / File / Validator / image.php
Il mio 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 cambiato in:
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.'));
}
Il problema sembra essere la imagecopyresampled
chiamata senza prima impostare la trasparenza poiché unisce lo sfondo nero predefinito imagecreatetruecolor
.
Quello che ho fatto è stato imagecopyresampled
passare all'istruzione switch e aggiungere le chiamate di trasparenza prima imagecopysampled
nel caso png (puoi anche usarlo per gif).
Quindi ora il mio if / switch è simile al seguente:
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;
}
Ciò ha mantenuto la mia trasparenza png durante i caricamenti delle immagini dei prodotti. Non so se questo aiuterà con la filigrana e ovviamente se lo usi copia il file nella tua cartella locale.
app / code / local / Mage / core / Modello / File / Validator / image.php
Proverei a salvare di nuovo l'immagine (magari con un altro programma). E se non aiuta puoi provare questo:
app / code / local / Varien / Image / Adapter / Gd2.php e copia il contenuto di /lib/Varien/Image/Adapter/Gd2.php
Modificare:
$this->_fillBackgroundColor($newImage);
A:
$this->_fillBackgroundColor($newImage, $frameWidth, $frameHeight);
Modificare:
if (!imagefill($imageResourceTo, 0, 0, $color)) {
A:
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/
Modifica: risolto in Magento 1.9.3.4 / SUPEE-9767 V2
app / code / core / Mage / core / Modello / File / Validator / image.php
Modificato da:
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;
}
A:
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;
}
Ho creato un modulo Magento secondo la risposta di Tim Sullivan che risolve questo problema:
Ho creato un file patch da installare facilmente nella cartella principale di Magento.
URL: scarica da qui
Ho scoperto che la regolazione dei file Image.php e GD2.php come suggerito nelle risposte precedenti funziona, ma per me significava che le miniature JPEG che non erano completamente quadrate improvvisamente avevano sfondi neri. Quindi in GD2.php ho cambiato
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
}
a
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}.");
}
}
al fine di mantenere la vecchia situazione per JPEG.