답변:
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
.
내가 한 것은 png imagecopyresampled
문에서 switch 문 으로 이동 하여 투명성 호출을 추가하는 imagecopysampled
것입니다 (gif에도 사용할 수 있음).
이제 내 if / switch는 다음과 같습니다.
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;
}
Tim Sullivan의 답변에 따라 해당 문제를 해결하는 Magento 모듈을 만들었습니다.
위의 답변에서 제안한대로 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의 오래된 상황을 유지하기 위해.