Miałem ten sam problem po aktualizacji 1.9.2.2 i 1.9.2.3. SUPEE-9767 dodaje rozszerzoną metodę sprawdzania poprawności w
app / code / core / Mage / Core / Model / File / Validator / Image.php
Moje było:
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.'));
}
I zmieniłem na:
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.'));
}
Problemem wydaje się być imagecopyresampled
połączenie bez uprzedniego ustawienia przezroczystości, ponieważ łączy ono domyślne czarne tło imagecreatetruecolor
.
To, co zrobiłem, to przejście imagecopyresampled
do instrukcji switch i dodanie wcześniej wywołań przezroczystości imagecopysampled
w przypadku png (możesz go również użyć do gif).
Więc teraz mój if / switch wygląda następująco:
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;
}
Dzięki temu zachowałem przejrzystość png podczas przesyłania zdjęć produktów. Nie wiem, czy to pomoże ze znakiem wodnym i oczywiście jeśli użyjesz tej kopii, skopiuj plik do lokalnego folderu.
app / code / local / Mage / Core / Model / File / Validator / Image.php
Spróbuję ponownie zapisać obraz (może z innym programem). A jeśli to nie pomoże, możesz spróbować:
Zmiana:
Do:
Zmiana:
Do:
Źródło: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/
Edycja: naprawiono to w Magento 1.9.3.4 / SUPEE-9767 V2
Zmieniony z:
Do:
źródło
Stworzyłem moduł Magento zgodnie z odpowiedzią Tima Sullivana, który rozwiązuje ten problem:
https://github.com/CopeX/PNGUploadFix
źródło
Stworzyłem plik łatki, który łatwo zainstalować w folderze głównym Magento.
URL: Pobierz stąd
źródło
Przekonałem się, że dostosowanie plików Image.php i GD2.php, jak sugerowano w powyższych odpowiedziach, działa, ale dla mnie oznaczało to, że miniatury JPEG, które nie były całkowicie kwadratowe, nagle miały czarne tło. W GD2.php zmieniłem się
do
w celu zachowania starej sytuacji dla plików JPEG.
źródło