回答:
1.9.2.2および1.9.2.3にパッチを適用した後、同じ問題が発生しました。SUPEE-9767は、拡張検証メソッドを追加します
app / code / core / Mage / Core / Model / File / Validator / Image.php
私は:
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.'));
}
変更後:
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.'));
}
問題は、imagecopyresampled
からデフォルトの黒の背景をマージするため、最初に透明度を設定しない呼び出しであるようですimagecreatetruecolor
。
私がしたことimagecopyresampled
は、switchステートメントに移動し、imagecopysampled
pngケースの前に透過呼び出しを追加することでした(gifにも使用できます)。
だから今私のif /スイッチは次のようになります:
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;
}
これにより、製品画像のアップロード中にpngが透明になりました。これが透かしに役立つかどうか、そしてこれを使用する場合は明らかにファイルをローカルフォルダーにコピーするかどうかはわかりません。
app / code / local / Mage / Core / Model / File / Validator / Image.php
画像を再度保存しようとします(別のプログラムを使用する場合があります)。そして、それが助けにならないなら、あなたはこれを試すことができます:
app / code / local / Varien / Image / Adapter / Gd2.phpおよび/lib/Varien/Image/Adapter/Gd2.phpの内容をコピーします
変化する:
$this->_fillBackgroundColor($newImage);
に:
$this->_fillBackgroundColor($newImage, $frameWidth, $frameHeight);
変化する:
if (!imagefill($imageResourceTo, 0, 0, $color)) {
に:
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
ソース: https : //www.gravitywell.co.uk/latest/how-to/posts/fixing-black-magento-adds-to-image-backgrounds/
編集:これはMagento 1.9.3.4 / SUPEE-9767 V2で修正されました
app / code / core / Mage / Core / Model / File / Validator / Image.php
変更後:
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;
}
に:
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モジュールを作成しました。
magentoのルートフォルダーに簡単にインストールできるパッチファイルを作成しました。
URL:ここからダウンロード
上記の回答で示唆されているようにImage.phpとGD2.phpのファイルを調整すると動作することがわかりましたが、私にとっては、完全に正方形ではないJPEGサムネイルが突然黒い背景になったことを意味しました。GD2.phpで変更しました
if (!imagefilledrectangle($imageResourceTo, 0, 0, $w, $h, $color)) {
throw new Exception("Failed to fill image background with color {$r} {$g} {$b}.");
}
に
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の古い状況を維持するため。