Yanıtlar:
1.9.2.2 ve 1.9.2.3 eklerinden sonra da aynı sorunu yaşadım. SUPEE-9767’de genişletilmiş bir doğrulama yöntemi ekler
Uygulama / kod / çekirdek / Mage / çekirdek / Model / Dosya / Doğrulayıcı / image.php
Benimki:
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.'));
}
Ve olarak değiştirildi:
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.'));
}
Sorun imagecopyresampled
, varsayılan olarak siyah arka planı birleştirirken, ilk önce saydamlığı ayarlamadan çağrı gibi görünüyor imagecreatetruecolor
.
Yaptığım şey, imagecopyresampled
switch deyimine geçmek ve imagecopysampled
png durumunda daha önce yapılan saydamlık çağrılarını eklemekti (ayrıca, gif için de kullanabilirsiniz).
Şimdi benim if / switch'im şuna benziyor:
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;
}
Bu, ürün resmi yüklemeleri sırasında png şeffaflığımı korudu. Bunun filigranla ilgili olup olmayacağını bilmiyorum ve açık bir şekilde bunu kullanıyorsanız dosyayı yerel klasörünüze kopyalayın.
Uygulamanın / kod / yerel / Büyücü / Çekirdek / Model / Dosya / Doğrulayıcı / image.php
Görüntüyü tekrar kaydetmeyi denerdim (belki başka bir programla). Ve yardım etmezse şunu deneyebilirsiniz:
app / code / local / Varien / Image / Adapter / Gd2.php ve /lib/Varien/Image/Adapter/Gd2.php içeriğini kopyalayın
Değişiklik:
$this->_fillBackgroundColor($newImage);
Kime:
$this->_fillBackgroundColor($newImage, $frameWidth, $frameHeight);
Değişiklik:
if (!imagefill($imageResourceTo, 0, 0, $color)) {
Kime:
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
Kaynak: https://www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/
Düzenleme: bu Magento 1.9.3.4 / SUPEE-9767 V2’de düzeltildi
Uygulama / kod / çekirdek / Mage / çekirdek / Model / Dosya / Doğrulayıcı / image.php
Tarafından değiştirildi:
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;
}
Kime:
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;
}
Magento kök klasörüne kolayca yükleyebileceğiniz bir yama dosyası oluşturdum.
URL: Buradan indirin
Image.php ve GD2.php dosyalarını yukarıdaki cevaplarda önerildiği gibi ayarlamanın işe yaradığını buldum, ancak benim için tamamen kare olmayan JPEG küçük resimlerinin aniden siyah arka planlara sahip olduğu anlamına geliyordu. Yani GD2.php de değiştim
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
}
için
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}.");
}
}
JPEG'lerin eski durumunu korumak için.